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”.
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.
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:
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.
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.
Î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.
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 „$”.
Î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 ProcedureExemplul 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 EndCodificarea caracterelor | |
---|---|
Codificări istorice | comp. suplimentare semafor (Makarov) morse Bodo MTK-2 comp. 6 biți SCP RADIX-50 EBCDIC KOI-7 ISO 646 |
reprezentare modernă pe 8 biți | simboluri ASCII non-ASCII Pagini de cod pe 8 biți chirilic KOI-8 Codificare de bază MacCyrillic ISO 8859 1 (lat.) 2 3 patru 5 (chir.) 6 7 opt 9 zece unsprezece 12 13 paisprezece 15 (€) 16 Windows 1250 1251 (Kir.) 1252 1253 1254 1255 1256 1257 1258 WGL4 IBM și DOS 437 850 852 855 866 „alternativă” MIC |
Multiocteți | tradiţional DBCS GB2312 HTML unicode UTF-32 UTF-16 UTF-8 lista de caractere chirilic |
interfața cu utilizatorul dispunerea tastaturii local traducere de linie font transliterare fonturi personalizate utilitati iconv record |