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.

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