UTF-32

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

UTF-32 (англ. Unicode Transformation Format) або UCS-4 (універсальний набір символів, англ. Universal Character Set) в інформатиці — один зі способів кодування символів Юнікоду, який використовує для кодування будь-якого символу рівно 32 біти. Інші кодування, UTF-8 і UTF-16, використовують для подання символів змінну кількість байтів. Символ UTF-32 є прямим поданням його кодової позиції[en]

Головна перевага UTF-32 перед кодуванням змінної довжини полягає в тому, що символи Юнікоду індексуються безпосередньо. Отримання n-ї кодової позиції є операцією, що займає однаковий час. І навпаки: коди зі змінною довжиною вимагають послідовного доступу до n-ї кодової позиції. Це робить заміну символів у рядках UTF-32 простою, індексом для цього є ціле число, як зазвичай робиться для рядків ASCII.

Головний недолік UTF-32 — це неефективне використання пам'яті, оскільки для зберігання символу використовується чотири байти. Символи, що лежать поза нульовою (базовою) площиною кодового простору, рідко застосовуються в більшості текстів. Тому подвоєння, порівняно з UTF-16, займаного рядками в UTF-32 обсягу, не виправдане.

Хоча використання незмінного числа байтів на символ зручне, але не настільки, як здається. Операція обрізання рядків реалізується легше, порівняно з UTF-8 та UTF-16. Але це не робить швидшим знаходження конкретного зміщення в рядку, оскільки зміщення може обчислюватися і для кодувань фіксованого розміру. Це не полегшує обчислення видимої ширини рядка, за винятком обмеженої кількості випадків, тому що навіть символ «фіксованої ширини» може отримуватися комбінуванням звичайного символу з модифікувальним, який не має ширини. Наприклад, літеру «й» можна отримати з літери «и» та діакритичного знака «гачок над літерою». Поєднання таких знаків означає, що текстові редактори не можуть розглядати 32-розрядний код як одиницю редагування. Редактори, які обмежуються роботою з мовами з письмом зліва направо та складеними символами (англ. precomposed character) можуть використовувати символи фіксованого розміру. Але такі редактори навряд чи підтримають символи, що лежать поза нульовою (базовою) площиною кодового простору і навряд чи зможуть працювати однаково добре із символами UTF-16.

Історія

[ред. | ред. код]

Стандарт ISO 10646 визначає 31-бітову форму кодування, названу UCS-4, в якій кожен закодований символ подано 32-розрядним значенням коду кодового простору чисел від 0 до 7FFFFFFF.

Оскільки насправді використовується лише 17 площин, то коди всіх символів мають значення від 0 до 0x10FFFF. UTF-32 — це підмножина UCS-4, яка використовує лише цей діапазон. Оскільки документ JTC1/SC2/WG2 встановлює, що всі майбутні призначення символів будуть обмежені нульовою (базовою) площиною кодового простору або першими додатковими 14 площинами, то UTF-32 зможе подати всі символи Юнікоду. Відповідно, UCS-4 і UTF-32 нині ідентичні, за винятком того, що стандарт UTF-32 має додаткову семантику Юнікоду.

Використання

[ред. | ред. код]

UTF-32 застосовується, переважно, не в рядках символів, а у внутрішніх API, де дані є єдиною кодовою позицією або гліфом. Наприклад, при промальовуванні тексту на останньому кроці будується список структур, кожна з яких включає позиції x і у, атрибути і єдиний символ UTF-32, що ідентифікує гліф для промальовування. Часто в «11 бітах, що не використовуються», кожного 32-бітового символу зберігають сторонню інформацію.

UTF-32 використовують для зберігання рядків у Unix тоді, коли тип wchar_t визначено як 32-бітовий. Програми на Python версії 3.2 включно можна було відкомпілювати для використання UTF-32 замість UTF-16. Від версії 3.3 підтримку UTF-16 видалено, і рядки зберігаються в UTF-32, але початкові нулі, в разі їх невикористання, оптимізуються. У Windows, де тип wchar_t має розмір 16 біт, рядки UTF-32 майже не використовуються.

Невикористання UTF-32 в HTML5

[ред. | ред. код]

Стандарт HTML5 говорить, що «автори не повинні використовувати UTF-32, оскільки алгоритми визначення кодування, описані в даній специфікації, не відрізняють його від UTF-16».

Посилання

[ред. | ред. код]