Из Википедии, бесплатной энциклопедии
  (Перенаправлен из UCS-4 )
Перейти к навигации Перейти к поиску

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

Основное преимущество UTF-32 заключается в том, что точки кода Unicode индексируются напрямую. Поиск N-й кодовой точки в последовательности кодовых точек - это операция с постоянным временем . Напротив, код переменной длины требует последовательного доступа для поиска N-й кодовой точки в последовательности. Это делает 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. [2] [1] Хотя в стандарте ISO (по состоянию на 1998 год в Unicode 2.1) "зарезервировано для частного использования" от 0xE00000 до 0xFFFFFF и от 0x60000000 до 0x7FFFFFFF [3]эти области были удалены в более поздних версиях. Поскольку в документе Принципы и процедуры Рабочей группы 2 ISO / IEC JTC 1 / SC 2 указано, что все будущие назначения кодовых точек будут ограничены диапазоном Unicode, UTF-32 сможет представлять все кодовые точки UCS и UTF-32. и UCS-4 идентичны.

Анализ [ править ]

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

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

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

Используйте [ редактировать ]

В основном UTF-32 используется во внутренних API-интерфейсах, где данные представляют собой отдельные кодовые точки или глифы, а не строки символов. Например, в современном рендеринге текста обычно последним шагом является создание списка структур, каждая из которых содержит координаты (x, y) , атрибуты и одну кодовую точку UTF-32, идентифицирующую глиф для рисования. Часто информация, не относящаяся к Unicode, хранится в «неиспользуемых» 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] Seed7 [6] и Lasso [ необходима ссылка ]языки программирования кодируют все строки с помощью UTF-32, полагая, что прямая индексация важна, тогда как язык Julia (до версии 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 кодируются парные суррогаты, как в CESU-8 . Из-за большого количества неиспользуемых 32-битных значений также возможно сохранить недопустимый UTF-8, используя значения, отличные от Unicode, для кодирования ошибок UTF-8, хотя для этого нет стандарта.

См. Также [ править ]

  • Сравнение кодировок Unicode

Ссылки [ править ]

  1. ^ a b Отображение кода указывает на формы кодирования Unicode , § 1: UTF-32
  2. ^ ISO / IEC 10646: 2014 Пункт 9.4: «Поскольку суррогатные кодовые точки не являются скалярными значениями UCS, единицы кода UTF-32 в диапазоне 0000 D800-0000 DFFF имеют неправильный формат». Пункт 4.57: «[Кодовое пространство UCS], состоящее из целых чисел от 0 до 10 FFFF (шестнадцатеричное)». Пункт 4.58: «[скалярное значение UCS] любая кодовая точка UCS, кроме кодовых точек с высоким и низким суррогатным кодом».
  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, 17 мая 2019 г. , получено 15 октября 2019 г.
  8. ^ "UTF-8 Everywhere Manifesto" .

Внешние ссылки [ править ]

  • Стандарт Unicode 5.0.0, глава 3  - формально определяет UTF-32 в § 3.9, D90 (PDF-страница 40) и § 3.10, D99-D101 (PDF-страница 45)
  • Приложение № 19 к стандарту Unicode  - формально определенный UTF-32 для Unicode 3.x (март 2001 г .; последнее обновление - март 2002 г.)
  • Регистрация новых кодировок: UTF-32, UTF-32BE, UTF-32LE  - объявление о добавлении UTF-32 в реестр кодировок IANA (апрель 2002 г.)