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 можно индексировать напрямую, но редко
используется при хранении из-за большого объема.