При работе с текстом на компьютерах и других устройствах предстоит иметь дело с разнообразными кодировками. Без них оборудование не сможет работать с буквами и символами.

Существуют разнообразные кодировки. Сегодня предстоит познакомиться с UTF-16 и сравнить данный стандарт с UTF-8. А еще – разобраться с тем, что собой представляет кодирование символом.

Данная информация будет полезна как IT-специалистам, так и обычным пользователям. Она поможет разобраться в ключевых аспектах существующих кодировок и объяснит, как работать с UTF-16.

О кодировании символов

Кодирование символов – это процесс присвоением графическим символам разнообразных номеров. Особенно это касается символов человеческого языка (алфавитов). С помощью кодирования можно будет хранить, передавать и преобразовывать текст посредством цифровых устройств, преимущественно – компьютеров.

Числовые значения, которые составляют кодировку символов – это кодовые точки. Совместно они формируют кодовое пространство. Оно также называется картой символов или кодовыми таблицами.

Юникод

Unicode – это стандарт шифрования (кодирования) символов. Он используется преимущественно для работы с текстовыми данными. Предназначается для поддержки текста во всех мировых системах письменности, доступных для оцифровки.

С помощью Юникода можно зашифровать все алфавиты мира. Сейчас этот стандарт является одним из самых распространенных в Интернете. Он был предложен в 1991 году некоммерческой организацией «Консорциум Юникода».

Применение соответствующего стандарта позволяет зашифровать огромное количество символов из самых разных систем письменности:

  • математические символы;
  • китайские и японские иероглифы;
  • кириллицу;
  • греческий алфавит;
  • латиницу;
  • музыкальные ноты и так далее.

Переключать для реализации поставленной задачи кодовые страницы не придется.

Стандарт Unicode включает в себя две части – универсальный набор символов (UCS) и семейство кодировок (UTF). Первая используется для перечисления допустимого по стандарту Юникода символа. Каждому из них она присваивает код в виде неотрицательного целого числа, которое обычно записывается в шестнадцатеричной форме с префиксом U+. Вторая часть (семейство кодировок) определяет способы преобразования символов для их дальнейшей передачи в потоке или в документе.

Unicode – стандарт, который предусматривает несколько «версий». UTF-16 и UTF-8 как раз к ним относятся. Далее предстоит получше узнать символы Unicode, записанные соответствующими методами.

UTF-16 и его характеристика

UTF-16 – это один из известных способов кодирования элементов Юникода. Они представлены в виде последовательности 16-битных слов.

Соответствующий способ шифрования позволяет записывать компоненты Юникода в диапазонах:

  • U+000…U+D7FF;
  • U+E000…U+10FFF.

Общее количество доступных символьных элементов составляет 1 112 064. Каждый компонент записывается при помощи суррогатных пар – одним или двумя словами. UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646.

Первая версия Юникода представляла собой кодировку в 16 бит. У нее была предусмотрена определенная символьная ширина. Общее количество разных символов составляло 216 – 65536. Вторая версия Unicode вышла в 1996 году. Вместе с ней кодовая область была значительно расширена. Для сохранения совместимости с теми текстовыми элементами, где был ранее реализован код, 16 бит Юникода сформировали UTF-16.

Принцип кодирования

В рассматриваемом стандарте элементы кодируются 2 байтами с использованием разнообразных диапазонных значений: от 0 до FFFF16. Допустимо для шифрования использовать диапазоны 000016…D7FF16 и E00016…FFFF16. Исключенный диапазон D80016…DFFF16 используется для суррогатных пар. Так называются символьные записи, которые шифруются двумя словами по 16 бит.

Элементы Юникода до FFFF16 включительно (без учета «суррогатного» диапазона) записываются словом 16 бит как есть. При использовании диапазона более 16 бит (1000016…10FFFF16) необходимо для шифрования использовать такой алгоритм:

  1. Из кода имеющегося элемента вычитается 1000016. Результатом станет значение от 0 до FFFFF16. Оно размещается в разрядной сетке 20 бит.
  2. Старшие 10 бит складываются с D80016. Результат записывается в ведущее (самое первое) слово. Оно должно быть в диапазоне D80016…DBFF16.
  3. Младшие 10 бит складываются с DC0016. Результат записывается в последующее слово (второе), входящее в диапазон DC0016…DFFFF16.

UTF-16 – стандарт, который используется в Интернете очень часто. Он является наиболее распространенным в Windows.

Порядок байт

В рассматриваемом стандарте одна символьная запись представлена последовательностью 2-х байтов или двух пар байтов. Системы, которые совместимы с процессорами x86, называют little endian. Если поддерживается совместимость с процессорами SPARC или m68k, – big endian.

Чтобы определить порядок байтов, нужно использовать метку порядков байтов. В начале текста записывается код U+FEFF. Если вместо этой записи считывается U+FFFE, порядок байтов будет обратным. Это связано с тем, что код U+FFFE в Юникоде не кодирует символьные компоненты. Он зарезервирован специально для определения порядка байтов.

UTF-16 и Windows

Рассматриваемый стандарт является наиболее распространенным в Windows-семействе. Он самый популярный в API Win32. В современных Виндовс предусматриваются два способа представления текста:

  • в виде 8-битных кодовых страниц;
  • в виде UTF-16.

Во втором случае Windows не будет накладывать на прикладное программное обеспечение никаких ограничений в плане кодирования текстовых файлов. Это позволяет приложениям задействовать не только UTF-16LE, но и UTF-16BE путем установки и трактовки соответствующей метки порядка байтов. Внутренний формат Windows всегда представлен UTF-16LE. Это необходимо учесть, если потребуется работать с исполняемыми документами, использующими юникодовые версии функций WinAPI. Строки в них всегда кодируются через UTF-16LE. Этот же вариант используется в файловых системах NTFS и FAT с поддержкой длинных имен при именовании документов.

UTF-8 и отличие от UTF-16

UTF-8 – это представление Юникода, которое обеспечивает наилучшую совместимость со старыми системами – такими, где использовались символьные записи 8 бит. Текст, состоящий только из элементов с номером меньше 128 при использовании UTF-8 преобразуется в обычный ASCII. Остальные компоненты Юникода – это последовательность длиной от двух до 6 байт. Чаще всего – от 1 до 4 байт. Это связано с тем, что в Unicode нет символов с кодом больше 10FFFF16. В ближайшем будущем их введение не планируется.

UTF-8 используется в качестве оптимизатора. Кодировка отлично подойдет для сочетания с ASCII, которые требуют для кодирования всего лишь 1 байт. Данный стандарт хорошо работает с текстом на английском языке, а также с веб-документами.

Если говорить про ранее рассмотренный стандарт (кодировка UTF 16), то он больше ориентирован на работу с обширными символьными наборами. Большинство из них используют для шифрования 2 байта, но некоторые – 4 байта. Это оптимальное решение для материалов, в которых встречаются преимущественно элементы, отличные от ASCII. В качестве примера можно привести азиатские алфавиты.

Особенности стандартов

UTF-8 – стандарт, который отлично подходит для текста, базирующегося на ASCII. К ним относят исходные коды и HTML-документы. В веб-кодировке этот вариант пользуется спросом за счет следующих моментов:

  1. Совместимость с ASCII. Шифрование «Аски» осуществляется в один байт. Это позволяет добиться отличной совместимости.
  2. Эффективное и рациональное использование памяти. На символ «уходит» от 1 до 4 байт.
  3. Отсутствие привязки к порядку байтов. Обмен данными между системами за счет этой особенности становится более простым.
  4. Защита от уязвимостей. UTF-8 дает возможность устранения некоторых уязвимостей безопасности.

Несмотря на это, ранее упомянутый и подробно рассмотренный стандарт все равно пользуется спросом. UTF-16 пригодится из-за:

  1. Фиксированной длины в BMP. Для основной многоязычной плоскости используются фиксированные 2 байта. Это положительно сказывается на некоторых операциях.
  2. Индексации данных. 16-битный код обеспечивает более быстрый доступ к символьным элементам в пределах BMP. Это достигается за счет их фиксированной длины. Скорость обработки дополнительных компонентов может упасть. Это связано с тем, что их представление требует пар 16-битных значений.
  3. Оптимизации использования памяти. Соответствующая особенность характерна для проектов, активно работающих с нелатинскими символами и в основном имеющих дело с памятью.

При работе с Java необходимо помнить, что тип char и класс String в JVM использует UTF-16. Он необходим для внутреннего представления символов.

Это означает следующее:

  • размер символов char в Java равняется 16 битам;
  • при работе со строками нужно принимать во внимание особенности суррогатных пар BMP.

Вообще, при выборе оптимального метода шифрования (кодировки) необходимо помнить следующее:

  1. Для файлов, в которых используется ASCII, лучше выбирать UTF-8. Он помогает экономить дисковое пространство и обеспечивает более высокую скорость обработки.
  2. Для XML и HTML, а также их производных, согласно стандартам W3C, лучше использовать UTF-8.
  3. При выборе нужно ориентироваться на языки представленного контента. Если в тексте преобладают нелатинские записи, может потребоваться UTF-16. Это зависит от конкретных потребностей.

UTF-8 – лидер среди сетевых протокол и текстовых файлов. UTF-16 больше встречается в Windows.

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!