Unicode — справочная информация и атрибуты символов

Стандарт Unicode развивается с тех пор, как в 1991 году была опубликована его первая версия Unicode 1.0. В каждую версию добавляются новые символы и их коды для обработки большего количества языков и алфавитов. У каждого символа в Unicode есть набор атрибутов, таких как Uppercase_Letter, Decimal_Number или Nonspacing_Mark. У многих символов есть атрибут алфавита, такой как латиница, хань (китайский) или арабский, в то время как у других, например у знаков пунктуации, такого атрибута нет. Как указано ниже, IDNA использует атрибуты символов, чтобы определить, какие символы разрешены в IDN-доменах. Атрибуты символов описаны в документе UAX#44 «База данных символов Unicode».

UTF8, UTF16 и другие способы кодирования

Символ Unicode может иметь числовое значение в диапазоне от нуля до 0x10FFFF. Поскольку один байт может содержать только значения от 0 до 0xFF, для хранения символов Unicode требуется многобайтовое кодирование.

В первоначальной версии Unicode было менее 64K (0xFFFF) символов, поэтому каждый символ мог поместиться в 16-битное целое число. Это привело к двухбайтовому кодированию, известному как USC или UCS-2. Когда количество символов в Unicode превысило 64K, USC был расширен до UTF-16, где для значений больше 64К используются пары в остальных случаях недействительных 16-битных символов, называемые суррогатными парами. Хотя эта система работает, она привела к проблемам отладки, так как суррогаты усложняют любой код для определения количество символов в строке или сортировки строк по порядку символов. Дополнительная проблема заключается в том, что некоторые компьютеры, в частности созданные IBM, первым хранят старший байт 16-разрядного значения («обратный порядок байтов»), а некоторые, например компьютеры Intel, первым хранят младший байт («прямой порядок байтов»). Вследствие этого у UTF-16 есть два варианта хранения: UTF-16BE и UTF-16LE. Существуют методы обнаружения и устранения проблем с порядком байтов, но они могут привести к ошибкам. В настоящее время UTF-16 в основном используется в существующих приложениях с с API-интерфейсами Microsoft Windows старых версий, а также в языках Java и Javascript. При альтернативном кодировании UTF-8 каждый символ Unicode — это строка переменной длины от одного до четырех байтов. У формата UTF-8 несколько преимуществ перед UTF-16, в том числе то, что подмножество ASCII Unicode кодируется как один байт тем же кодом, поэтому любая строка ASCII автоматически является строкой UTF-8. Код UTF-8 обычно более компактен, чем его эквивалент в формате UTF-16, и его легче сортировать, поскольку строки UTF-8, отсортированные в порядке байтов, автоматически располагаются в порядке символов. IDNA и EAI требуют кодировки UTF-8.

UTF-32 — это простой формат, в котором каждый символ хранится как 32-битное целое число. Это удобно для внутренней обработки в программах, поскольку символы в массиве UTF-32 можно индексировать напрямую, но редко используется при хранении из-за большого объема.