UTF-32 - UTF-32

UTF-32 (32- bitowy format transformacji Unicode ) to kodowanie o stałej długości używane do kodowania punktów kodu Unicode, które wykorzystuje dokładnie 32 bity (cztery bajty ) na punkt kodu (ale liczba bitów wiodących musi wynosić zero, ponieważ jest ich znacznie mniej więcej niż 2 32 punkty kodowe Unicode, które w rzeczywistości wymagają tylko 21 bitów). UTF-32 to kodowanie o stałej długości, w przeciwieństwie do wszystkich innych formatów transformacji Unicode, które są kodowaniami o zmiennej długości. Każda 32-bitowa wartość w UTF-32 reprezentuje jeden punkt kodu Unicode i jest dokładnie równa wartości liczbowej tego punktu kodu.

Główną zaletą UTF-32 jest to, że punkty kodowe Unicode są bezpośrednio indeksowane (ale litery w ogóle, czyli „ grafem klastry”, czy niektóre emotikony nie mogą być bezpośrednio indeksowane, ani nie jest wyświetlany obliczania szerokości ciąg łatwiej). Znalezienie N-tego punktu kodowego w sekwencji punktów kodowych jest operacją na stałym czasie . W przeciwieństwie do tego, kod o zmiennej długości wymaga dostępu sekwencyjnego, aby znaleźć N - ty punkt kodowy w sekwencji. To sprawia, że ​​UTF-32 jest prostym zamiennikiem w kodzie, który używa liczb całkowitych zwiększanych o jeden w celu zbadania każdej lokalizacji w ciągu, jak to zwykle robiono w przypadku ASCII .

Główną wadą UTF-32 jest to, że nie zajmuje dużo miejsca, używając czterech bajtów na punkt kodowy, w tym 11 bitów, które zawsze są zerowe. Znaki spoza BMP są stosunkowo rzadkie w większości tekstów (z wyjątkiem np. tekstów z niektórymi popularnymi emotikonami) i zazwyczaj można je zignorować przy szacowaniu rozmiaru. To sprawia, że ​​UTF-32 jest prawie dwukrotnie większy niż UTF-16 . Może być do czterech razy większy od UTF-8, w zależności od tego, ile znaków znajduje się w podzbiorze ASCII .

Historia

Oryginalna norma ISO 10646 definiuje 32-bitową formę kodowania o nazwie UCS-4 , w której każdy punkt kodowy w Universal Character Set (UCS) jest reprezentowany przez 31-bitową wartość od 0 do 0x7FFFFFFFF (bit znaku był nieużywany i zero ). W listopadzie 2003 r. Unicode został ograniczony przez RFC 3629, aby dopasować się do ograniczeń kodowania UTF-16 : wyraźnie zabraniając punktów kodowych większych niż U + 10FFFF (a także wysokich i niskich surogatów U + D800 do U + DFFF). Ten ograniczony podzbiór definiuje UTF-32. Chociaż standard ISO miał (od 1998 w Unicode 2.1) „zarezerwowane do użytku prywatnego” 0xE00000 do 0xFFFFFF i 0x60000000 do 0x7FFFFFFFF te obszary zostały usunięte w późniejszych wersjach. Ponieważ dokument dotyczący zasad i procedur grupy roboczej 2 ISO/IEC JTC 1/SC 2 stwierdza, że ​​wszystkie przyszłe przypisania punktów kodowych będą ograniczone do zakresu Unicode, UTF-32 będzie w stanie reprezentować wszystkie punkty kodowe UCS i UTF-32 i UCS-4 są identyczne.

Analiza

Chociaż stała liczba bajtów na punkt kodowy wydaje się wygodna, nie jest tak przydatna, jak się wydaje. Ułatwia to obcinanie, ale nie znacznie w porównaniu do UTF-8 i UTF-16 (oba mogą wyszukiwać wstecz punktu do obcięcia, patrząc na 2–4 ​​jednostki kodu). W praktyce, z powodu np. sekwencji emoji ZWJ (i/lub modyfikatorów emoji zmieniających prawdopodobnie kolor skóry ), niektóre emoji nie są już jednym punktem kodowym, np. „👨‍🦲 Mężczyzna: Łysy” i „👩‍🦰 Kobieta: Rude Włosy” a zatem tekst nie może polegać na tym, że jest listą symboli, z których każdy jest reprezentowany przez jeden punkt kodowy.

Niezwykle rzadko kod chce znaleźć N - ty punkt kodowy bez wcześniejszego badania punktów kodowych od 0 do N–1. Na przykład parsowanie XML nie może nic zrobić ze znakiem bez uprzedniego sprawdzenia wszystkich poprzedzających znaków. Tak więc indeks całkowity, który jest zwiększany o 1 dla każdego znaku, można zastąpić przesunięciem całkowitym, mierzonym w jednostkach kodu i zwiększanym o liczbę jednostek kodu w miarę sprawdzania każdego znaku. Usuwa to postrzegane zalety szybkości UTF-32.

UTF-32 nie ułatwia obliczania wyświetlanej szerokości ciągu, ponieważ nawet przy czcionce o stałej szerokości może istnieć więcej niż jeden punkt kodu na pozycję znaku ( łączenie znaków ) lub więcej niż jedna pozycja znaku na punkt kodu (" klastry grafemowe ” dla ideogramów CJK ). Edytory, które ograniczają się do języków pisanych od lewej do prawej i prekomponowanych znaków, mogą korzystać z jednostek kodu o stałym rozmiarze, ale takie edytory raczej nie obsługują znaków innych niż BMP, a zatem mogą działać równie dobrze z UTF-16 .

Posługiwać się

Głównym zastosowaniem UTF-32 są wewnętrzne interfejsy API, w których dane są pojedynczymi punktami kodowymi lub glifami, a nie ciągami znaków. Na przykład we współczesnym renderowaniu tekstu często ostatnim krokiem jest zbudowanie listy struktur, z których każda zawiera współrzędne (x,y) , atrybuty i pojedynczy punkt kodowy UTF-32 identyfikujący glif do narysowania. Często informacje inne niż Unicode są przechowywane w „nieużywanych” 11 bitach każdego słowa.

Użycie ciągów znaków UTF-32 w systemie Windows (gdzie wchar_t to 16 bitów) prawie nie istnieje. W systemach Unix łańcuchy UTF-32 są czasami, ale rzadko, używane wewnętrznie przez aplikacje, ponieważ typ wchar_t jest zdefiniowany jako 32-bitowy. Wersje Pythona do 3.2 można skompilować, aby używać ich zamiast UTF-16 ; od wersji 3.3 wszystkie ciągi znaków Unicode są przechowywane w UTF-32, ale z wiodącymi bajtami zerowymi są zoptymalizowane „w zależności od [punktu kodowego] z największą liczbą porządkową Unicode (1, 2 lub 4 bajty)”, aby wszystkie punkty kodu miały ten rozmiar . Języki programowania Seed7 i Lasso kodują wszystkie ciągi znaków za pomocą UTF-32, wierząc, że bezpośrednie indeksowanie jest ważne, podczas gdy język programowania Julia odszedł od wbudowanej obsługi UTF-32 wraz z wydaniem 1.0, upraszczając język do posiadania tylko ciągów UTF-8 (ze wszystkimi innymi kodowaniami uznanymi za przestarzałe i przeniesionymi ze standardowej biblioteki do pakietu) po „UTF-8 Everywhere Manifesto”.

Warianty

Choć technicznie nieważne, połówki zastępcze są często kodowane i dozwolone. Pozwala to na tłumaczenie nieprawidłowych UTF-16 (takich jak nazwy plików Windows) na UTF-32, podobnie jak działa wariant UTF-8 WTF-8 . Czasami sparowane zastępniki są kodowane zamiast znaków innych niż BMP, podobnie jak CESU-8 . Ze względu na dużą liczbę nieużywanych wartości 32-bitowych możliwe jest również zachowanie nieprawidłowych wartości UTF-8, używając wartości innych niż Unicode do kodowania błędów UTF-8, chociaż nie ma na to standardu.

Zobacz też

Bibliografia

Zewnętrzne linki