WikiDer > UTF-32

UTF-32

UTF-32 (32-немного Формат преобразования Unicode) - это кодировка фиксированной длины, используемая для кодирования Unicode кодовые точки который использует ровно 32 бита (четыре байты) на кодовую точку (но количество начальных битов должно быть равно нулю, так как их гораздо меньше, чем 232 Кодовые точки Unicode).[нужна цитата] UTF-32 - это кодировка с фиксированной длиной, в отличие от всех других форматов преобразования Unicode, которые являются кодировками переменной длины. Каждое 32-битное значение в UTF-32 представляет одну кодовую точку Unicode и в точности равно числовому значению этой кодовой точки.

Основное преимущество UTF-32 заключается в том, что точки кода Unicode индексируются напрямую. Нахождение Nth кодовая точка в последовательности кодовых точек - это постоянное время операция. Напротив, код переменной длины требует последовательный доступ найти Nth кодовая точка в последовательности. Это делает UTF-32 простой заменой в коде, использующем целые числа, увеличивающиеся на единицу, для проверки каждого места в строке, как это обычно делалось для ASCII.

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

История

Оригинал ISO 10646 стандарт определяет 32-битный форма кодирования называется UCS-4, в котором каждая кодовая точка в Универсальный набор символов (UCS) представлен 31-битным значением от 0 до 0x7FFFFFFF (знаковый бит не использовался и равен нулю). В ноябре 2003 года Unicode был ограничен RFC 3629 чтобы соответствовать ограничениям UTF-16 кодирование: явный запрет кодовых точек больше, чем U + 10FFFF (а также высокие и низкие суррогаты от U + D800 до U + DFFF). Это ограниченное подмножество определяет UTF-32.[1][2] Хотя в стандарте ISO (по состоянию на 1998 год в Unicode 2.1) "зарезервировано для частного использования" от 0xE00000 до 0xFFFFFF и от 0x60000000 до 0x7FFFFFFF[3] эти области были удалены в более поздних версиях. Поскольку документ о принципах и процедурах ISO / IEC JTC 1 / SC 2 Рабочая группа 2 заявляет, что все будущие назначения кодовых точек будут ограничиваться диапазоном Unicode, UTF-32 сможет представлять все кодовые точки UCS, а UTF-32 и UCS-4 идентичны.

Анализ

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

Крайне редко[нужна цитата] этот код хочет найти Nth кодовая точка без предварительного изучения кодовых точек от 0 до N – 1. Например, синтаксический анализ XML ничего не может сделать с символом без предварительного просмотра всех предшествующих символов.[4] Таким образом, целочисленный индекс, который увеличивается на 1 для каждого символа, может быть заменен целочисленным смещением, измеряемым в единицах кода и увеличиваемым на количество единиц кода при проверке каждого символа. Это устраняет очевидные преимущества скорости.[нужна цитата] из UTF-32.

UTF-32 не упрощает вычисление отображаемой ширины строки, поскольку даже с шрифтом «фиксированной ширины» может быть более одной кодовой точки на позицию символа (объединение персонажей) или более одной позиции символа на кодовую точку ("графема кластеры »для CJK идеограммы). Редакторы, которые ограничиваются языками с письмом слева направо и заранее составленные символы могут использовать блоки кода фиксированного размера, но такие редакторы вряд ли будут поддерживать символы, отличные от BMP, и поэтому могут одинаково хорошо работать с UTF-16.

Использовать

В основном UTF-32 используется во внутренних API-интерфейсах, где данные представляют собой отдельные кодовые точки или глифы, а не строки символов. Например, в современном рендеринге текста обычно последним шагом является создание списка структур, каждая из которых содержит координаты (x, y), атрибуты и одна кодовая точка UTF-32, идентифицирующая глиф для рисования. Часто информация не в Юникоде хранится в «неиспользуемых» 11 битах каждого слова.[нужна цитата]

Использование строк UTF-32 в Windows (где wchar_t составляет 16 бит) практически не существует. В системах Unix строки UTF-32 иногда, но редко, используются приложениями внутри компании из-за типа wchar_t определяется как 32-битный. Python версии до 3.2 могут быть скомпилированы, чтобы использовать их вместо UTF-16; начиная с версии 3.3 все строки Unicode хранятся в UTF-32, но с начальными нулевыми байтами, оптимизированными "в зависимости от [кодовой точки] с наибольшим порядковым номером Unicode (1, 2 или 4 байта)", чтобы все кодовые точки были такого размера .[5] Семя7[6] и Лассо[нужна цитата] языки программирования кодируют все строки с помощью UTF-32, полагая, что прямая индексация важна, тогда как Юля язык (до версии 1.0) имел UTF-32 в качестве одной из собственных кодировок для строк (в дополнение к UTF-8 и UTF-16) в стандартной библиотеке, но упрощен до наличия только строк UTF-8 (со всеми остальными кодировки считаются устаревшими и перемещены из стандартной библиотеки в пакет[7]); в соответствии с "Манифестом UTF-8 Everywhere".[8]

Варианты

Хотя суррогатные половинки технически недействительны, они часто кодируются и разрешаются. Это позволяет преобразовывать недопустимые UTF-16 (например, имена файлов Windows) в UTF-32, аналогично тому, как WTF-8 вариант UTF-8 работает. Иногда вместо символов не-BMP кодируются парные суррогаты, аналогично ЦЭСУ-8. Из-за большого количества неиспользуемых 32-битных значений также можно сохранить недопустимый UTF-8, используя значения, отличные от Unicode, для кодирования ошибок UTF-8, хотя для этого нет стандарта.

Смотрите также

Рекомендации

  1. ^ ИСО / МЭК 10646: 2014 Пункт 9.4: «Поскольку суррогатные кодовые точки не являются скалярными значениями UCS, единицы кода UTF-32 в диапазоне 0000 D800-0000 DFFF имеют неправильный формат». Пункт 4.57: «[Кодовое пространство UCS], состоящее из целых чисел от 0 до 10 FFFF (шестнадцатеричное)». Пункт 4.58: «[скалярное значение UCS] любая кодовая точка UCS, кроме кодовых точек с высоким и низким суррогатным кодом».
  2. ^ Сопоставление кодовых точек с формами кодировки Unicode, § 1: UTF-32
  3. ^ УНИВЕРСАЛЬНЫЙ НАБОР ХАРАКТЕРОВ (UCS)
  4. ^ https://www.ibm.com/developerworks/xml/library/x-utf8/
  5. ^ Лёвис, Мартин. «PEP 393 - Гибкое представление строки». python.org. Python. Получено 26 октября 2014.
  6. ^ «Использование UTF-32 имеет несколько преимуществ».
  7. ^ JuliaStrings / LegacyStrings.jl: устаревшие строковые типы Unicode, JuliaStrings, 2019-05-17, получено 2019-10-15
  8. ^ "Манифест UTF-8 Everywhere".

внешняя ссылка