UTF-32

от Уикипедия, свободната енциклопедия

UTF-32 (или UCS-4) е съкращение от Unicode Transformation Format 32 бита. Това е протокол за кодиране на Unicode кодови точки, който използва точно 32 бита за кодова точка. Това прави UTF-32 кодирането с фиксирана дължина, за разлика от всички други Unicode трансформативни формати, които са с променлива дължина. Формата на UTF-32 за кодова точка е директното представяне на числовата стойност на тази точка.

Основното предимство на UTF-32, в сравнение с кодирането с променлива дължина, е че точките се индексират директно. Проучването на N-тата п е постоянна величина. За разлика при кодирането с променлива дължина достъпът до точките трябва да бъде последователен, за да се открие N-тата точка. UTF-32 прави проста подмяна в кода, като ползва числа за индексиране на отделните знаци в низовете, както обикновено се прави за ASCII.

Главният недостатък на UTF-32 е неефективността му спрямо използваното пространство, ползвайки 4 бита за кодова точка. Знаците, които не са BMP (Basic Multilingual Plane: съдържа знаци за почти всички модерни езици, както и голям брой символи), са толкова редки в повечето текстове, че може да се считат за несъществуващи при проблемите с оразмеряването, правейки размера на UTF-32 до два пъти колкото UTF-16 и до четири – UTF-8.

История[редактиране | редактиране на кода]

Оригиналният ISO 10646 стандарт дефинира 31 битово кодиране, наричан UCS-4 (Universal Character Set), при който всеки кодиран знак е представен от 32 битова стойност от цели числа между 0 и шестнадесетичен 7FFFFFFF. Понеже се ползват само 17 BMP части, всички кодови точки са между 0 и 0x10FFFF. UTF-32 е подгрупа на UCS-4, който ползва този диапазон. Тъй като принципите и процедурите посочени в JTC1/SC2/WG2 документацията заявяват, че всички бъдещи задания на знаците ще бъдат ограничени до BMP или до първите 14 допълнителни части, UTF-32 ще бъде в състояние да представя всички Unicode знаци. Ето защо UCS-4 и UTF-32 са идентични с изключение на това, че UTF-32 има допълнителна Unicode семантика.

Анализ[редактиране | редактиране на кода]

Въпреки че фиксиран брой бита за кодова точка е удобно, не е толкова полезно колкото изглежда. Това прави орязването по-лесно, но не значително в сравнение с UTF-8 и UTF-16 (и при двата формата може да се търси точка за съкращаване в обратен ред гледайки по 2 – 4 кодови единици).

Изключително рядко е даден код да намери N-тата точка без предварително разглеждане на точките от 0 до N – 1. Това означава, че индекс увеличен с 1 за всеки знак може да бъде заменен с изместеното число, измерено в кодови единици и увеличено с броя кодови единици, като всеки знак се разглежда. Това премахва всички предимства със скоростта при работа с UTF-32. В малкото случаи, където точката N е генерирана без предварително преглеждане на кода, като хеширане и високоскоростни алгоритми за търсене, няма нужда N да бъде представена с точност и по този начин, с орязване, може да бъде пригодено за работа с UTF-8 или UTF-16, чрез настройване на позицията до най-близката граница на кодова точка, операция с фиксирано време. UTF-32 не пресмята показаната ширина на низа по-лесно, тъй като дори и при шрифт с „фиксирана ширина“ може да има знаци, съдържащи повече от една кодова точка на позиция (комбинирани знаци) или повече от един знак на дадена позиция – например CJK (китайски, японски, корейски) йероглифи. Редактори, които се ограничават до езици с начин на изписване от ляво надясно и по-сложни знаци, могат да се възползват от фиксираните по размер кодови единици, но е малко вероятно да поддържат знаци, които не са част от BMP и за това работят еднакво добре с UTF-16 кодиране.

Употреба[редактиране | редактиране на кода]

Основната употреба на UTF-32 е във вътрешните APIs, където данните са единични кодови букви или знаци, а не низове от знаци. Например при съвременното представяне на текст обикновено последната стъпка е да се изгради списък от структури, всяка съдържаща позиция „x“ и „y“, атрибути и единичен UTF-32 знак, който идентифицира глифа за рисуване. Често информацията, която не е Unicode се съхранява в „неизползваните“ 11 бита от всяка дума.

При Unix системите, UTF-32 низовете понякога се използват за склад, понеже типа wchar_t се дефинира от 32-бита. Python версиите до 3.2 могат да се компилират за да ползват UTF-32 вместо UTF-16. При следващите версии от 3.3 нататък, поддръжката на UTF-16 е прекратена и се използва система, където низовете се съхраняват в UTF-32, но с водещи 0 оптимизирани бита при необходимост. Seed7 и Lasso кодират всички знаци и символи с UTF-32. Използването на UTF-32 низове под Windows (където wchar_t е 16 бита) е почти несъществуващо.

От праткическа гледна точка основният недостатък на UTF-32 е, че изисква 32 бита за всеки символ. В повечето случаи за един символ в средностатистически текст са нужни по-малко, което води до лошо съотношение на значимите битове. В някои случаи обаче това не е от съществено значение (при употребата на APIs/приложно-програмни интерфейси, изискващи UTF-32 текстови параметри например) и удобството на фиксиран брой бита за кодова точка. Трябва да се има предвид и логичното следствие от увеличаването на нужното количество памет за съхраняване на еднакъв брой символи – а именно по-бързо достигане до кеш лимити; осезаемо увеличение на времето за писане/четене и т.н.

Неизползваемост при HTML5[редактиране | редактиране на кода]

HTML5 заявява, че авторите не трябва да ползват UTF-32, тъй като алгоритмите за разпознаване на кодировката умишлено не го отличават от UTF-16.

Източници[редактиране | редактиране на кода]