UTF-16

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 11 februarie 2018; verificările necesită 27 de modificări .

UTF-16 ( Unicode Transformation Format ) în informatică  este una dintre modalitățile de a codifica caracterele din Unicode ca o secvență de cuvinte de 16 biți . 

Această codificare vă permite să scrieți caractere Unicode în intervalele U+0000..U+D7FF și U+E000..U+10FFFF (număr total 1 112 064 ). În acest caz, fiecare caracter este scris în unul sau două cuvinte (o pereche surogat). Codificarea UTF-16 este descrisă în apendicele Q la standardul internațional ISO/IEC 10646 și este, de asemenea, acoperită în IETF RFC 2781 „UTF-16, o codificare a ISO 10646”.

Istoricul aspectului

Prima versiune de Unicode (1991) a fost o codificare cu lățime fixă ​​de 16 biți; numărul total de caractere diferite a fost 2 16 ( 65 536 ). În cea de-a doua versiune a Unicode (1996), s-a decis extinderea semnificativă a zonei de cod; pentru a menține compatibilitatea cu acele sisteme în care Unicode pe 16 biți a fost deja implementat și a fost creat UTF-16. Zona 0xD800-0xDFFF, rezervată perechilor surogat, aparținea anterior zonei „personaje de uz privat”.

Deoarece 2 20 +2 16 −2048 ( 1 112 064 ) caractere pot fi afișate în UTF-16 , acest număr a fost ales ca nouă valoare a spațiului de cod Unicode.

Principiul codificării

DC00 DFFE DFF
D800 010000 0103FE 0103FF
D801 010400 0107FE 0107FF
DBFF 10FC00 10FFFE  

În UTF-16, caracterele sunt codificate ca cuvinte pe doi octeți folosind toate intervalele de valori posibile (de la 0 la FFFF 16 ). Este posibilă codificarea caracterelor Unicode în intervalele 0000 16 ..D7FF 16 și E000 16 ..FFFF 16 . Intervalul D800 16 ..DFFF 16 exclus de aici este folosit doar pentru codificarea așa-numitelor perechi surogat - caractere care sunt codificate cu două cuvinte de 16 biți.

Caracterele Unicode până la FFFF 16 inclusiv (excluzând intervalul pentru surogate) sunt scrise așa cum sunt cu un cuvânt de 16 biți.

Caracterele din intervalul 10000 16 ..10FFFF 16 (mai mult de 16 biți) sunt codificate conform următoarei scheme:

Endianness

Un singur caracter UTF-16 este reprezentat de o secvență de doi octeți sau două perechi de octeți. Care dintre cei doi octeți vine primul, mare sau scăzut, depinde de endian . Un sistem compatibil cu procesoare x86 se numește little endian , în timp ce cei cu procesoare m68k și SPARC  se numesc big endian .

Marca de ordine a octetilor este folosit pentru a determina ordinea octetilor .  La începutul textului se scrie codul U+FEFF. La citire, dacă a fost luat în considerare U+FFFE în loc de U+FEFF, atunci ordinea octetilor este inversată (little endian), deoarece codul U+FFFE în Unicode nu codifică un caracter și este rezervat doar în scopul determinării octetului Ordin. Deoarece UTF-8 nu utilizează valorile 0xFE și 0xFF, puteți utiliza marcajul de ordine a octeților ca o caracteristică pentru a distinge între UTF-16 și UTF-8.

UTF-16LE și UTF-16BE

De asemenea, este posibil să specificați ordinea octeților extern - pentru aceasta, codificarea trebuie descrisă ca UTF-16LE sau UTF-16BE (little-endian / big-endian), și nu doar UTF-16. În acest caz, marcajul ordinului octetilor (U+FEFF) nu este necesar.

UTF-16 pe Windows

În API -ul Win32 , comun în versiunile moderne ale sistemului de operare Microsoft Windows , există două moduri de a reprezenta text: sub forma unor pagini de cod tradiționale de 8 biți și sub formă de UTF-16.

Când se utilizează UTF-16, Windows nu impune restricții privind codificările fișierelor text pentru aplicații, permițându-le să utilizeze atât UTF-16LE, cât și UTF-16BE prin setarea și interpretarea marcajului corespunzător de ordine a octetilor . Cu toate acestea, formatul intern Windows este întotdeauna UTF-16LE. Acest punct trebuie luat în considerare atunci când lucrați cu fișiere executabile care utilizează versiuni Unicode ale funcțiilor WinAPI. Șirurile din ele sunt întotdeauna codificate în UTF-16LE [1] .

În sistemele de fișiere NTFS , precum și în FAT cu suport pentru nume lungi, numele fișierelor sunt , de asemenea, scrise în UTF-16LE.

Exemple de proceduri

Exemplele de mai jos sunt scrise în pseudocod și nu țin cont de masca de ordine a octeților - arată doar esența codificării. Ordinea octetilor - de la mai tânăr la mai în vârstă (Little-Endian, Intel x86). Tipul Word este un cuvânt de doi octeți (întreg fără semn de 16 biți), iar tipul UInt32 este un întreg fără semn pe 32 de biți. Valorile hexazecimale încep cu semnul dolar „$”.

Codificare

În exemplu WriteWord() , o procedură condiționată care scrie un cuvânt (în timp ce se deplasează indicatorul intern). Funcția LoWord()returnează cuvântul cel mai puțin semnificativ dintr-un număr întreg de 32 de biți (biții mai mari sunt eliminați fără a căuta).

// Valori valide ale codului: $0000..$D7FF, $E000..$10FFFF. Procedură WriteUTF16Char ( Cod : UInt32 ) If ( Cod < $10000 ) Atunci WriteWord ( LoWord ( Cod ) ) Else Code = Code - $10000 Var Lo10 : Word = LowWord ( Cod și $3FF ) Var Hi10 : Word = LoWord ( Cod Shr ) WriteWord ( $D800 sau Hi10 ) WriteWord ( $DC00 sau Lo10 ) End If End Procedure

Decodare

Exemplul ReadWord()citește un cuvânt din flux (deplasând indicatorul intern). De asemenea, poate ajusta ordinea octeților, dacă este necesar. Funcția WordToUInt32extinde un cuvânt de doi octeți la un întreg fără semn de patru octeți, completând biții mari cu zerouri. Error()întrerupe execuția (în esență o excepție ).

// Dacă reușește, valorile // din intervalele $0000..$D7FF și $E000..$10FFFF sunt returnate. Funcție ReadUTF16Char : UInt32 Var Leading : Cuvânt // Lider (primul) cuvânt. Var Trailing : Cuvânt // Urmează (al doilea) cuvânt. Leading = ReadWord () ; If ( Leading < $D800 ) Sau ( Leading > $DFFF ) Then Return WordToUInt32 ( Leading ) Else If ( Leading >= $DC00 ) Then Error ( " Secvență de cod nevalidă . " ) Else Var Cod : UInt32 Cod = WordToUInt32 ( Leading And $3FF ) Shl 10 Trailing = ReadWord () If (( Trailing < $DC00 ) Or ( Trailing > $DFFF )) Then Error ( " Secvență de cod nevalidă . " ) Else Code = Code Or WordToUInt32 ( Trailing And $3FF ) Return ( Cod + 10000 USD ) Funcția End If End If End

Note

  1. Utilizarea marcajelor de ordine a octetilor . Data accesului: 18 februarie 2016. Arhivat din original la 22 ianuarie 2016.

Link -uri