UTF-16

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

UTF-16 (anglicky 16-bit Unicode Transformation Format) je způsob kódování znaků ISO 10646/Unicode používající proměnnou délku kódu: pro kódování jednoho znaku se používají jedna nebo dvě 16bitové hodnoty. UTF-16 je rozšířením kódování staršího UCS-2; pro znaky v BMP (znaky v rozmezí U+0000–U+FFFF) se UTF-16 shoduje s UCS-2, tj. kóduje znaky přímo jako 16bitová čísla bez znaménka. Zatímco UCS-2 ostatní znaky (ty s kódy většími než 0xFFFF) kódovat neumožňuje vůbec, UTF-16 je kóduje pomocí dvou šestnáctibitových hodnot (anglicky surrogate pair) z intervalu 0xDC00 až 0xDFFF.

Princip funkce[editovat | editovat zdroj]

Znaky do U+FFFF jsou kódovány přímo jednou šestnáctibitovou hodnotou, znaky s vyššími kódy jsou rozděleny do dvou šestnáctibajtových čísel a doplněny tak, že první číslo je v rozmezí 0xD8000xDBFF a druhé číslo je v rozmezí 0xDC000xDFFF. Následující tabulka ukazuje způsob kódování (pozice bitů „xxx“ jsou vyplněny bity kódu znaku, vpravo jsou nejméně významné bity):

U+000000 – U+00FFFF xxxxxxxxxxxxxxxx
U+010000 – U+10FFFF 110110xxxxxxxxxx 110111xxxxxxxxxx

Jelikož UTF-16 kóduje znaky do šestnáctibitových hodnot, je pro další zpracování zpravidla potřeba tyto šestnáctibitové hodnoty ještě převést do posloupnosti bajtů. Konkrétní způsob však závisí na používaném pořadí bajtů. Pro jednoznačnost se tedy někdy používají označení pro specifické schéma kódování: UTF-16LE (little-endian) a UTF-16BE (big-endian). Pokud se uvádí jen UTF-16, může na počátku být vložen BOM, kódování znaku U+FEFF, podle kterého příjemce rozpozná použité pořadí bajtů. Pokud není použité pořadí bajtů určeno explicitně, ani se nepoužije BOM, není kódování jednoznačné, zpravidla se chápe podle kontextu (typicky podle architektury příslušného počítače).

Příklad[editovat | editovat zdroj]

Text „x∈𝕄“ je kódován takto:

Text x 𝕄
Znaky Unicode U+0078 U+2208 U+1D544
UTF-16 kódování 0078 2208 D835 DD44
Bajty v UTF-16BE 78 00 08 22 35 D8 44 DD

Výsledkem tedy je posloupnost šestnáctibitových hodnot 0078 2208 D835 DD44, resp. (při použití UTF-16LE) posloupnost bajtů 78 00 08 22 35 D8 44 DD.

Kódování[editovat | editovat zdroj]

Dle RFC 2781 se kódují znaky definované normou ISO 10646 následovně:

  1. Znaky s hodnotou menší než 0x010000 jsou zakódovány přímo jako 16bitové celé číslo.
  2. U ostatních znaků (0x0100000x10FFFF) se od jejich hodnoty odečte 0x010000. Výsledkem je číslo v rozsahu 0x0000000x0FFFFF, které lze vyjádřit pomocí 20 bitů.
  3. Horních 10 bitů předchozího výsledku vyplní spodní bity 16bitového čísla 0xD800 (původně v něm je spodních 11 bitů nulových, tedy volných), zatímco spodních 10 bitů výsledku se přičte k 16bitovému číslu 0xDC00 (spodních 10 bitů v něm je původně volných) a je zakódováno.

Dekódování[editovat | editovat zdroj]

Při dekódování jsou vstupní data čtena po 16 bitech a je prováděno následující rozhodování:

  1. Pokud je hodnota menší než 0xD800 nebo větší než 0xDFFF, jedná se o konečný výsledek.
  2. V opačném případě musí být hodnota v rozmezí 0xD8000xDBFF a je třeba přečíst dalších 16 bitů, které musí ležet v rozsahu od 0xDC00 do 0xDFFF.
  3. Horních 10 bitů výsledku je utvořeno z dolních 10 bitů prvního čísla a dolních 10 bitů výsledku se vezme z druhého čísla, k výsledku se v tomto případě přičte ještě 0x010000 a jedná se o konečný výsledek.

Použití[editovat | editovat zdroj]

UTF-16 se používá pro text v API v systémech Microsoft Windows 2000/XP/2003/Vista/7/8/CE.[1] Starší systémy Windows NT (před Windows 2000) podporují pouze UCS-2.[2] Ve Windows XP nejsou pro evropské jazyky žádné znaky s kódy přes U+FFFF.[3][4] Obsah souborů a dat přenášených sítěmi bývá často směs kódování UTF-16, UTF-8 a starších kódových stránek.

iSeries systémy firmy IBM používají kódovou stránku CCSID 13488 pro kódování UCS-2, CCSID 1200 pro kódování UTF-16 a CCSID 1208 pro kódování UTF-8.[5]

UTF-16 používá operační systém Qualcomm BREW, prostředí platformy .NET i multiplatformní knihovna pro vytváření GUI Qt.

Symbian OS použitý v telefonech Nokia S60 a Sony Ericsson UIQ používá UCS-2. Telefony iPhone používají pro SMS UTF-16 místo kódování UCS-2 popisovaného ve standardech 3GPP TS 23.038 a IS-637.[6]

Systém souborů Joliet používaný pro dlouhá jména souborů na CD-ROM používá ve jménech souborů kódování UCS-2BE (max. délky 64 znaků).

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku UTF-16 na anglické Wikipedii.

  1. Unicode (Windows). Retrieved 08 March 2011 "These functions use UTF-16 (wide character) encoding (…) used for native Unicode encoding on Windows operating systems."
  2. Description of storing UTF-8 data in SQL Server [online]. microsoft.com, 2005-12-07, [cit. 2008-02-01]. Dostupné online.  
  3. Unicode [online]. microsoft.com, [cit. 2009-07-20]. Dostupné online.  
  4. Surrogates and Supplementary Characters [online]. microsoft.com, [cit. 2009-07-20]. Dostupné online.  
  5. Character conversion [online]. IBM, [cit. 2012-05-22]. Dostupné online.  
  6. Chad Selph. Adventures in Unicode SMS [online]. Twilio, 2012-11-08, [cit. 2015-08-28]. Dostupné online.  

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]