UTF-16

Z Wikipedii, wolnej encyklopedii

UTF-16 (ang. 16-bit Unicode Transformation Format) – jeden ze sposobów kodowania znaków standardu Unicode. Sposób ten wymaga użycia szesnastobitowych słów, przy czym dla znaków na pozycjach poniżej U+10000 (dziesiętnie 65536), a dokładnie w zakresach od U+0000 do U+D7FF i U+E000 do U+FFFF, używane jest jedno słowo, którego wartość odpowiada dokładnie pozycji znaku w standardzie.

W systemach Windows kodowanie to jest najczęściej używane do wewnętrznego przechowywania komunikatów Unicode[1].

Kodowanie na 4 bajtach[edytuj | edytuj kod]

Dla znaków z wyższych pozycji używa się dwóch słów, pierwsze z nich należy do przedziału od U+D800 do U+DBFF, drugie natomiast od U+DC00 do U+DFFF. Oznacza to, iż znaki z zakresu od U+10000 do U+10FFFF kodowane są w następujący sposób:

  • od numeru znaku odejmowane jest 0x10000, tak aby pozostała 20-bitowa liczba z zakresu od 0 do 0xFFFFF;
  • wartość tworzona przez najstarsze 10 bitów tej liczby jest dodawana do 0xD800 i otrzymuje się bardziej znaczące 16-bitowe słowo z zakresu od 0xD800 do 0xDBFF;
  • pozostałe 10 młodszych bitów jest dodawane do 0xDC00, co daje mniej znaczące 16-bitowe słowo z zakresu od 0xDC00 do 0xDFFF.

Kodowanie to przedstawia poniższa tabela:

KOD DC00 DC01    …    DFFF
D800 010000 010001 0103FF
D801 010400 010401 0107FF
  ⋮
DBFF 10FC00 10FC01 10FFFF

Na przykład znak o kodzie U+10000 zostanie zamieniony na sekwencję 0xD800 0xDC00, zaś znak o kodzie 0x10FFFF (górna granica unikodu) na 0xDBFF 0xDFFF. W standardzie Unicode pozycjom z przedziału od U+D800 do U+DFFF nie są przypisane żadne znaki, zatem każda sekwencja słów kodowych jest interpretowana jednoznacznie.

Przykład[edytuj | edytuj kod]

  1. Odjęcie 0x10000 od 0x10437 daje w wyniku 0x00437, czyli binarnie 0000 0000 0100 0011 0111.
  2. Rozdzielenie powstałego ciągu 20 bitów na dwie grupy, po 10 bitów każda 0000000001 0000110111.
  3. Dodanie 0xD800 do pierwszej wartości: 0xD800 + 0x0001 = 0xD801.
  4. Dodanie 0xDC00 do drugiej wartości: 0xDC00 + 0x0037 = 0xDC37.
  5. W ten sposób rezultatem są cztery bajty w postaci D8 01 DC 37.


Poniższa tabela pozwala zrozumieć sposób kodowana różnej długości numerów kodowych Unicode w UTF-16. Dodatkowe bity dodane przez kodowanie pokazane są na czarno

Unicode Unicode binarnie UTF-16 binarnie UTF-16
szesnastkowo
UTF-16
dla Big-endian
UTF-16
dla Little-endian
$ U+0024 00000000 00100100 00000000 00100100 0024 00 24 24 00
U+20AC 00100000 10101100 00100000 10101100 20AC 20 AC AC 20
𐐷 U+10437 0001 00000100 00110111 11011000 00000001 11011100 00110111 D801 DC37 D8 01 DC 37 01 D8 37 DC
𤭢 U+24B62 0010 01001011 01100010 11011000 01010010 11011111 01100010 D852 DF62 D8 52 DF 62 52 D8 62 DF

Zobacz też[edytuj | edytuj kod]

Przypisy[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]