UTF-16 este o codificare a caracterelor definite de Unicode în care fiecare caracter este codificat într-o succesiune de unul sau doi cuvinte pe 16 biți .
Codificarea a fost definită în Raportul tehnic 17 la standardul Unicode. De atunci, acest apendice a devenit învechit deoarece UTF-16 este o parte integrantă a standardului Unicode, în capitolul 3 Conformitate care îl definește foarte strict.
UTF-16 nu trebuie confundat cu UCS-2, care este codificarea mai simplă a fiecărui caracter pe doi octeți. Aceste două standarde sunt totuși ambele numite Unicode, deoarece codarea este aceeași atâta timp cât nu se utilizează intervalele U + D800 până la U + DFFF (în principiu rezervate) și intervalele după U + FFFF (puțin utilizat în Occident).
UTF-16 este utilizat în special în mediile Windows. În acest sistem, așa-numitele API Unicode folosesc acest standard. Același lucru este valabil și pentru sistemul NTFS .
UTF-16 este standardul de șiruri utilizat de UEFI .
Numărul fiecărui caracter (un punct de cod ) este dat de standardul ISO / IEC 10646 și reprodus identic în Unicode standard . Punctele de cod care pot fi reprezentate trebuie să fie în intervalul de validitate U + 0000 până la U + 10FFFF și nu trebuie să fie atribuite unui non-caracter. Toate caracterele posibile din Unicode au astfel de puncte de cod.
Orice punct de cod care nu este un non-caracter și a cărui valoare poate fi codificată pe un singur punct de cod de doi octeți (16 biți ), adică orice punct de cod U + 0000 la U + D7FF și U + E000 la U + FFFD, este stocat pe un singur cuvânt pe 16 biți (intervalul fără caractere U + D800 până la U + DFFF este, prin urmare, exclus, adică punctele de cod ai căror 5 biți cei mai semnificativi sunt 11011 ).
În celelalte cazuri, caracterul este un punct de cod al unui plan suplimentar (deci între U + 10000 și U + 10FFFD și ai cărui 16 biți cel mai puțin semnificativi nu trebuie să fie egali cu 0xFFFE sau 0xFFFF); este apoi stocat în 2 cuvinte succesive ( puncte de cod ) de câte 16 biți fiecare, ale căror valori corespund punctelor de cod rezervate în jumătățile indirecte alocate în planul de bază multilingv al standardelor Unicode și ISO / IEC 10646:
Apoi, în funcție de formatul de stocare a cuvintelor pe 16 biți într-un flux ordonat de octeți , două sisteme sunt posibile pentru codarea finală:
Numărul caracterului | 00000000 000uuuuu xxxxxxyy aaaaaaaa | |||
---|---|---|---|---|
Codificare UTF-16BE (pe 2 octeți) |
xxxxxxyy | yyyyyyyy | ||
(numai dacă uuuuu = 00000 ) | ||||
Codificare UTF-16BE (pe 4 octeți) |
110110ww | wwxxxxxx | 110111yy | yyyyyyyy |
cu wwww = uuuuu - 1 (dacă uuuuu > 00000 ) |
Numărul caracterului | 00000000 000uuuuu xxxxxxyy aaaaaaaa | |||
---|---|---|---|---|
Codificare UTF-16LE (pe 2 octeți) |
yyyyyyyy | xxxxxxyy | ||
(numai dacă uuuuu = 00000 ) | ||||
Codificare UTF-16LE (pe 4 octeți) |
wwxxxxxx | 110110ww | yyyyyyyy | 110111yy |
cu wwww = uuuuu - 1 (dacă uuuuu > 00000 ) |
Indicarea tipului de codificare utilizat (ordinea octeților) poate fi implicită pentru protocolul utilizat sau specificată în mod explicit de acest protocol (indicând de exemplu numele rezervate „UTF-16BE” sau „UTF-16LE” într-un antet din setul de caractere MIME ). Dacă protocolul nu permite specificarea ordinii octeților și dacă permite una sau alta dintre alternative, codificarea UTF-16 a punctului de cod valid U + FEFF poate fi utilizată ca indicator în capul fluxul de date (deoarece o modificare a ordinii octeților săi la citirea fluxului va duce la un punct de cod U + FFFE, valabil în Unicode, dar atribuit unui non-caracter și, prin urmare, interzis în acest caz în orice flux UTF-16 Acest cod astfel , punctul reprezentat (numit ordine octet indicator , marca de ordine octet în limba engleză, prescurtată BOM ) va fi codificat numai la începutul fluxului de date, și vă permite să știți cum a fost codificat fluxul:
1 st octet | 2 nd byte | Codificare eficientă |
---|---|---|
0xFE | 0xFF | mare endian |
0xFF | 0xFE | mic endian |
Dacă una dintre cele două secvențe de câte doi octeți este prezentă în capul fluxului, tipul de codificare este dedus din acesta și secvența este eliminată din flux: nu reprezintă niciun caracter al textului stocat în acest flux de date. Dacă niciuna dintre cele două secvențe nu se află în capul fluxului de date, standardul Unicode specifică faptul că fluxul trebuie decodat în endian mare (UTF-16BE).
În afară de la începutul fluxului (inclusiv după un BOM inițial), aceste secvențe nu sunt recunoscute ca codificând un BOM și decodarea continuă cu un singur tip de codificare; deci dacă aceste secvențe apar după start, atunci:
În mod similar, fluxul trebuie considerat nevalid și nu conține text conform Unicode dacă conține un cuvânt pe 16 biți între 0xD800 și 0xDBFF care nu este urmat imediat de un cuvânt între 0xDC00 și 0xDFFF sau dacă conține un cuvânt pe 16 biți între 0xDC00 și 0xDFFF nu este precedat imediat de un cuvânt între 0xD800 și 0xDBFF, sau dacă decodarea arată punctul de cod al oricărui alt non-caracter.