Skip to content

Latest commit

 

History

History
134 lines (82 loc) · 15.6 KB

README.md

File metadata and controls

134 lines (82 loc) · 15.6 KB

Описание

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

История

В 60-е годы в США был разработан стандарт ASCII (American Standard Code for Information Interchange) ставший основным видом кодирования символов для компьютеров, телеграфов и телекоммуникационного оборудования. Он был задуман как замена устаревшим и разнообразным форматам кодирования символов оставшихся со времён развития телеграфа. Изначально ASCII являлась 7-битной и позволяла кодировать 128 символов (27=128). Которые включали в себя управляющие символы, цифры, латинские буквы и знаки препинания.

Изначально ASCII являлась 7-битной и позволяла кодировать 128 символов (27=128). Которые включали в себя управляющие символы, цифры, латинские буквы и знаки препинания.

img

Общие символы ASCII

Основной недостаток ASCII заключался в том, что он поддерживал только латинский алфавит. Это затрудняло его использование с другими языки. Особенно не европейской группы. Проблема была частично решена за счёт расширения кодирования до 8-битного, что позволяет кодировать 256 символов (28=256). Первые 128 символов единые для любой кодировки, а оставшиеся с 129 по 256 используются под национальные символы.

Из-за ограничения в 256 символов под практически каждый язык требуется создавать отдельную кодировку. Для многих языков есть множество вариантов кодировок (например, для русского языка встречается 5 кодировок). Кодировки между системами требуется согласовывать между собой, что создаёт множество проблем при неправильной настройке кодировок на одной из сторон.

ASCII не подходит для языков с иероглифами (китайский, японский и пр.), т.к. кодирования в 256 символов не достаточно для них.

В конце 80-х появился новый формат кодирования Unicode, который объединил все языки в одну кодировку за счёт увеличения разрядности до 4-х байт (231 = ~2.1 млрд.). Но в начале 90-х Unicode не получил популярности по причине увеличения объема занимаемой и передаваемой текстовой информации. Стоимость хранения и передачи данных на тот момент была в сотни раз выше, чем сегодня.

Например, время скачивание текстовой версии произведения “Война и мир” (~3млн. символов) в начале 2000-х через модем на скорости 33600 бит/c (типовая скорость для того времени) составит 12 минут, а в формате Unicode (UTF-32) 48 минут. Сегодня подобное скачивание составит пару секунд.

Начиная с середины 2000-х стоимость накопителей и интернета стремительно падает, а скорость растёт. Интернет становится мультиязычным и Unicode постепенно увеличивает свою долю в программах и интернете. Минусы Unicode становятся не так критичны, как его достоинства для мультиязычного ИТ-мира.

На сегодняшний день большинство сайтов и программ используют Unicode. Стандарт Unicode расширяется с каждым годом и включает в себя всё больше языков и символов.

Набор символов

Каждый символ в Unicode имеет свой уникальный номер. Он выглядит как U+#####. Например, U+0055 это латинская буква S. Порядковые номера символов сгруппированы по смыслу или языку (например, с 0020 по 007F – основные символы латиницы).

img

Группировки Unicode (первые группы)

На более высоком уровне нумерация делится на 16 плоскостей по 65536 (216) символов. Плоскость обозначает собой “редкость” использования символов и служит в первую очередь для разработчиков шрифтов. Например, плоскость 0 это базовые языки и любой шрифт должен их поддерживать. Плоскость 2 это редкие иероглифические символы которые могут потребовать только в узкоспециализированных задачах и не требуются для большинства шрифтов.

Кодирование

В Unicode символ кодируется 1-4 байтами в зависимости от позиции символа в таблице и выбранной кодировки. Основные форматы кодирования описаны ниже.

UTF-8

Символ кодируется от 1 до 4 байт в зависимости от порядкового номера символа. Первые биты символа обозначают количество байт в символе и позволяет понять из какого диапазона данный символ:

Диапазон Байт Описание
U-0000 – U-007F 1 Базовый латинский алфавит, ASCII, базовые знаки препинания
U-0080 – U-07FF 2 Национальные и расширенные алфавиты, дополнительные знаки препинания
U-0800 – U-FFFF 3 Иероглифические и редкие алфавиты, специфические математические символы
U-10000 – U-10FFFF 4 Мёртвые языки, очень редкие иероглифы, редкие и устаревшие символы

Обладает обратной совместимостью с ASCII по базовым латинским символам. Т.е. первые 128 символов кодируются аналогично для ASCII и UTF-8.

Эффективен для латинского алфавита, т.к. символы в этом диапазоне занимают 1 байт.

Плюсы
  • Оптимальный размер “байт на символ” в случае использования распространенных не иероглифических языков.
  • Фиксированный порядок байт.
  • Распространенность (>95% веб-сайтов и программ).
  • Совместимость с ASCII по первым 128 символам.
Минусы
  • Неэффективное использование пространства при использование иероглифических языков. (~+25% против UTF-16)

UTF-16

Символ кодируется от 2 до 4 байт в зависимости от порядкового номера символа. Диапазон от U+0000 до U+FFFF кодируется 2 байтами, диапазон от U+10000 до U+10FFFF кодируется 4 байтами.

Плюсы
  • Более эффективное использование пространства для иероглифических языков, чем у UTF-8/32.
Минусы
  • Неэффективное использование пространства при использование латинского языка.
  • В некоторых ситуация нельзя отличить от UTF-32.

UTF-32

Символ содержит в себе 4 байта (31 бит) и позволяет кодировать до ~2.1 млрд. символов (для совместимости с UTF-16 ограничено ~1.1 млн.). Имеет фиксированную длину в 4 байта (02 46 8A CE). Практически не используется на практике, по причине избыточности. В данный момент в Unicode присутствует ~140.000 символов, что составляет <15% от доступного объёма. Изредка используется в API или узкоспециализированных задачах когда требуется фиксированная длина байт. Основной плюс – возможно непосредственной индексации символов, т.к. длина символа всегда 4 байта. Это даёт прирост скорости в некоторых операциях.

Плюсы
  • Фиксированная длина символа
  • Быстрая индексация
Минусы
  • Неэффективное использования пространства, избыточность. Большая часть содержимого данных будет состоять из нулей.
  • В некоторых случая нельзя отличить от UTF-16

Последовательность байт

В UTF-16/32 существует два варианта последовательности байт. LE (little-endian) и BE (big-endian). В случае LE порядок байт идёт младшего к старшему (67 45 23 01), в случае BE от старшего к младшему (01 23 45 67). Для идентификации последовательности байт используется метка порядка байтов (BOM, byte order mark) которая выставляется первым символом документа (символ U+FEFF). Если в начале текста прочитано FE FF – текст в формате UTF-16 BE, FF FE – формат UTF-16 LE, EF BB BF – UTF-8. Данные символы зарезервированы в Unicode под обозначение порядка байт. По умолчанию используется LE.

В UTF-8 порядок байт всегда LE и символ BOM обычно не используется. Это также позволяет отличить UTF-8 от UTF-16/32.

Примеры кодирования:

Символ Номер Кодировка Запись в HEX
S U+0053 UTF-8 53
UTF-16 0053
UTF-32 00000053
Й U+0419 UTF-8 D0 99
UTF-16 0419
UTF-32 00000419
U+AC26 UTF-8 EA B0 A6
UTF-16 AC26
UTF-32 0000AC26
𐌸 U+10338 UTF-8 F0 90 8C B8
UTF-16 D800 DF38
UTF-32 00010338

Вывод

Для текстового редактора и если продукт разрабатывается для стран использующих иероглифы, то есть смысл использовать UTF-16. Это позволит более эффективно использовать пространство, т.к. большинство символов будет умещаться в 2 байта, когда в UTF-8 они будут занимать 3 байта.

В остальных случаях для текстового редактора кодировка UTF-8 является предпочтительней. В случае использования латинского алфавита символы будут занимать 1 байт против 2 байт у UTF-16. В остальных случаях аналогично UTF-16 по 2 байта. И только в редких случаях использования редких иероглифов UTF-8 будет занимать 3 байта вместо 2 байт у UTF-16.

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

Данный вывод не подходит для принятия решения использования кодировок в API и БД.

Ссылки

https://unicode-table.com - таблица всех символов Unicode

http://qaz.wtf/u/show.cgi - расшифровщик глифов (combining character)