UTF-16

UTF-16 ( engleză pentru U niform Multiple-Octet Coded Character Set (UCS) T ransformation F ormat for 16  Planes of Group 00 ) este o codificare cu lungime variabilă pentru caracterele Unicode . UTF-16 este optimizat pentru caracterele utilizate frecvent din planul multilingv de bază  (BMP) . Este cel mai vechi dintre formatele de codificare Unicode .

General

În codificarea UTF-16, fiecărui caracter Unicode i se atribuie un șir special codificat de una sau două unități de 16 biți , adică H. de doi sau patru octeți , astfel încât - ca și celelalte formate UTF - toate caracterele Unicode să poată fi mapate.

În timp ce UTF-8 are o importanță centrală în protocoalele de internet , UTF-16 este utilizat în multe locuri pentru reprezentarea internă a șirurilor de caractere , de ex. B. în versiunile actuale ale .NET , Java și Tcl .

caracteristici

Datorită codificării tuturor caracterelor BMP în doi octeți, codarea UTF-16 are spațiul necesar pentru textele care constau în principal din litere latine în comparație cu codarea ISO-8859 sau UTF-8 adecvate . Cu toate acestea, dacă multe caractere BMP sunt codificate dincolo de punctul de cod  U + 007F, UTF-16 necesită o cantitate comparabilă de spațiu sau mai puțin decât UTF-8.

Spre deosebire de UTF-8, nu există o rezervă de codare. Dacă un text codat UTF-16 este interpretat ca ISO 8859-1 , toate literele conținute în ultima codificare pot fi recunoscute, dar separate prin zero octeți; cu alte codificări ISO-8859, compatibilitatea este mai proastă.

standardizare

UTF-16 este definit atât de Consorțiul Unicode , cât și de ISO / IEC 10646 . Unicode definește semantica suplimentară . O comparație mai precisă poate fi găsită în Anexa C a standardului Unicode 4.0. Standardul ISO a definit, de asemenea, o codificare  UCS-2 , în care, totuși, sunt permise doar reprezentări pe 16 biți ale BMP.

Codificare

Conectați-vă pe BMP

Caracterele valide ale BMP (U + 0000 la U + D7FF și U + E000 la U + FFFF) sunt mapate fiecare direct la un singur cuvânt de 16 biți sau la doi octeți.

Semnați în afara BMP

Educație + compoziția internă a celor două subblocuri.
U 'nu este codul original U, ci codul după scădere:
U' = U - 10000 hex

Caracterele Unicode din afara BMP (adică U + 10000 până la U + 10FFFF) sunt reprezentate fiecare de două cuvinte pe 16 biți ( unități de cod ) care aparțin împreună, adică un total de patru octeți. (Adică 32 de biți, dar codificarea nu este UTF-32.)

Pentru a codifica un astfel de caracter în UTF-16, numărul 65536 (10000 hex = dimensiunea BMP) este mai întâi scăzut din numărul de cod al caracterului (numit aici U ), rezultând un număr U de 20 de biți în intervalul de la 00000 hex la FFFFF se creează hex . Aceasta este apoi împărțită în două blocuri de câte 10 biți:

  • primul bloc (adică cei 10 biți mai semnificativi ai codului U ') este precedat de secvența de biți 11011 0 , cuvântul rezultat de 16 biți constând din doi octeți este cunoscut sub numele de surogat înalt
  • al doilea bloc (adică cei 10 biți de ordin scăzut al codului U ') este precedat de secvența de biți 11011 1 , cuvântul rezultat de 16 biți de doi octeți este cunoscut sub numele de surogat scăzut .

Următoarele zone de cod sunt special concepute pentru astfel de surogate, i. H. UTF-16 caractere de înlocuire, rezervate și, prin urmare , nu conțin caractere independente:

  • de la U + D800 la U + DBFF (2 10  = 1024 surogate ridicate)
  • de la U + DC00 la U + DFFF (2 10  = 1024 surogate mici).

Când convertiți șiruri de caractere codate UTF-16 în secvențe de octeți UTF-8, trebuie remarcat faptul că perechile de surogate mari și mici trebuie mai întâi combinate din nou pentru a forma un cod de caractere Unicode înainte de a fi apoi convertit într-o secvență de octeți UTF-8 poate fi convertit (exemplu în descrierea pentru UTF-8 ). Deoarece acest lucru nu este adesea luat în considerare, a fost stabilită o codare diferită, incompatibilă pentru caracterele de înlocuire, care a fost ulterior standardizată ca CESU-8 .

Ordinea de octeți

În funcție de care dintre cei doi octeți ai unui cuvânt pe 16 biți este transmis sau stocat mai întâi, se vorbește despre Big Endian  (UTF-16BE) sau Little Endian  (UTF-16LE). Indiferent de acest lucru, cuvântul surogat înalt vine întotdeauna înainte de cuvântul surogat scăzut .

Pentru caracterele ASCII care sunt traduse în UTF-16, aceasta înseamnă că caracterul adăugat 0 se află în bitul cel mai semnificativ

  • cu Big Endian și
  • în Micul Endian .

Cu protocoale specificate inadecvate, se recomandă ca caracterul Unicode U + FEFF ( BOMmarca de ordine a octetului ) să fie un spațiu cu lățime zero și fără întrerupere de linie ( lățime zero , spațiu fără întrerupere , stând) la începutul fluxului de date pentru a seta - dacă este interpretat ca un caracter Unicode invalid U + FFFE ( nu un caracter ), aceasta înseamnă că ordinea de octeți între expeditor și receptor este diferită și octeții fiecărui cuvânt de 16 biți trebuie schimbați la receptor pentru a evalua corect fluxul de date ulterior.

Exemple

Unele exemple de codare pentru UTF-16 sunt date în tabelul următor:

Exemple de codificări UTF-16
caracter Unicode Binar Unicode UTF-16BE binar UTF-16BE hexadecimal
Litera y U + 0079 00000000 0 1111001 00000000 0 1111001 00 79
Litera a U + 00E4 00000000  11100100 00000000  11100100 00 E4
Semn euro U + 20AC 00100000  10101100 00100000  10101100 20 AC
Treble Clef ? U + 1D11E 0000 000 1  110100 01 00011110 110110 00 0 0 110100  110111 01 00011110 D8 34 DD 1E
Ideograma CJK ? U + 24F5C 0000 00 10  010011 11 01 011 100 110110 00  01 010011  110111 11 01 011 100 D8 53 DF 5C

Ultimele două exemple sunt în afara BMP. Deoarece multe fonturi nu conțin încă aceste noi zone Unicode, caracterele conținute acolo nu pot fi afișate corect pe multe platforme. În schimb, este afișat un caracter de înlocuire, care servește ca substituent. În exemple, doar unul sau doi biți sunt modificați prin scăderea a 10000 hex (în exemplul prezentat în culoarea magenta) și surogatele sunt formate din biții creați în acest fel.

Exemplu de calcul al surogatelor

Toate numerele sunt date mai jos pe baza 16.

Für die Unicode-Position v
SG-Word1 =  + D800
SG-Word2 =  + DC00


        = 64321
SG-Word1 =  + D800
         = D950
SG-Word2 =  + DC00
         = DF21

Vezi si

Dovezi individuale

  1. Unicode 4.0, Anexa C (PDF; 155 kB)