UTF-16
UTF-16 (Format de transformare Unicode, 16 biți) este o codificare a caracterelor Unicode în secvențe de numere de 16 biți . UTF-16 este definit oficial în anexa Q la standardul ISO / IEC 10646 și este descris în versiunea 3.0 și ulterioară a „ standardului Unicode ”, precum și în documentul IETF RFC 2781 .
Codificare UTF-16
În UTF-16, caracterele Unicode cu o valoare de până la 65535 (0xFFFF) sunt reprezentate cu valoarea lor numerică, exprimată în 16 biți. Caracterele din afara planului de bază multilingv , al căror cod este mai mare de 65535 (0xFFFF) și nu poate fi reprezentat direct cu 16 biți, sunt reprezentate cu o pereche surogat , adică o pereche de coduri în intervalul de la 0xD800 la 0xDFFF. De exemplu:
- caracterul „A”, corespunzător codului 65 (0x41), este reprezentat ca 0x0041
- caracterul 0x10000 devine perechea 0xD800, 0xDC00
- caracterul 0x10FFFD, corespunzător limitei superioare a Unicode, este reprezentat cu secvența 0xDBFF, 0xDFFD.
Unicode nu atribuie niciunui caracter o valoare între 0xD800 și 0xDFFF, împiedicând astfel confundarea elementelor individuale ale unei perechi surogat cu un caracter Unicode valid.
Variante ale UTF-16
Fiecare punct de cod UTF-16 este stocat într-un număr întreg de 16 biți (uint16). Deoarece ordinea octeților dintr-un cuvânt variază în funcție de arhitectura computerului, UTF-16 are trei scheme de codificare, UTF-16, UTF-16LE ( Little Endian ) și UTF-16BE ( Big Endian ).
Codificarea UTF-16 necesită ca ordinea de octeți să fie declarată în mod explicit prin adăugarea unei mărci de ordine de octeți ca prefix la fiecare text codat. BOM este forma codificată a caracterului de lățime zero, spațiu care nu se rupe , corespunzător 0xFEFF hexadecimal, reprezentat ca 0xFE, 0xFF pe sistemele endian mari și 0xFF, 0xFE pe sistemele endian mici .
Codificările UTF-16BE și UTF-16LE sunt identice cu codificarea UTF-16, cu excepția faptului că ordonarea octeților este implicită, endian mare pentru UTF-16BE și endian mic pentru UTF-16LE. Caracterul 0xFEFF de la începutul unui text reprezentat cu oricare dintre aceste două codificări este tratat mai degrabă ca parte a textului decât ca o BOM.
IANA a aprobat numele UTF-16, UTF-16BE și UTF-16LE, atât majuscule, cât și minuscule, pentru utilizare pe Internet . Utilizate în mod obișnuit UTF_16 sau UTF16 nume pot fi recunoscute de limbaje de programare specifice sau aplicații, dar nu sunt în mod oficial valabile.
UTF-16 este reprezentarea textului nativ pentru versiunile bazate pe NT de Windows , limbajul de programare Java și mediile .NET și macOS Cocoa și Core.
Exemple
Caracter Unicode | Nume | Coduri UTF-16 | caracter* |
---|---|---|---|
122 (hex 0x7A) | Minuscule Z (scris latin) | 007A | z |
27700 (hex 0x6C34) | apă (chineză) | 6C34 | 水 |
119070 (hex 0x1D11E) | cheia lui Sol | D834 DD1E | 𝄞 |
„水, z, 𝄞” (apă, z, cheia lui G), codificat în UTF-16 | ||
---|---|---|
tip de codificare | ordinea de octeți | secvența de octeți în memorie |
UTF-16LE | mic endian | 34 6C, 7A 00, 34 D8 1E DD |
UTF-16BE | mare endian | 6C 34, 00 7A, D8 34 DD 1E |
UTF-16 | mic endian, cu BOM | FF FE, 34 6C, 7A 00, 34 D8 1E DD |
UTF-16 | mare endian, cu BOM | FE FF, 6C 34, 00 7A, D8 34 DD 1E |
* Sunt necesare fonturi și software compatibile Unicode pentru a afișa corect caracterele .
Procedura de codare UTF-16
Să presupunem că vrem să codificăm caracterul U + 64321 (hex 0x64321). Fiind mai mare de 0xFFFF, acesta trebuie reprezentat cu o pereche surogat, astfel:
v = 0x64321 v ′ = v - 0x10000 = 0x54321 = 0101 0100 0011 0010 0001
vh = 0101010000 // 10 biți mari de v ′ vl = 1100100001 // 10 biți mici de v ′ w1 = 0xD800 // w1 și w2 sunt inițializate cu prima pereche surogat w2 = 0xDC00 w1 = w1 | vh = 1101 1000 0000 0000 | 01 0101 0000 = 1101 1001 0101 0000 = 0xD950
w2 = w2 | vl = 1101 1100 0000 0000 | 11 0010 0001 = 1101 1111 0010 0001 = 0xDF21
Prin urmare, reprezentarea caracterului U + 64321 este următoarea pereche de cuvinte pe 16 biți:
0xD950 0xDF21
Elemente conexe
linkuri externe
- Notă tehnică Unicode # 12: UTF-16 pentru procesare , pe unicode.org .