UTF-16
UTF-16(anglicky16-bit Unicode Transformation Format) je způsobkódováníznakůISO 10646/Unicodepouží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šíhoUCS-2;pro znaky vBMP(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í dvojice šestnáctibitových hodnot (anglicky označované jakosurrogate pair) z intervalu 0xD800 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 reprezentovány pomocí dvou šestnáctibitových čísel tak, že první číslo je v rozmezí0xD800–0xDBFFa druhé číslo je v rozmezí0xDC00–0xDFFF.Jelikož v rozmezí U+D800 až U+DFFF nedefinuje Unicode žádné platné znaky (tento rozsah je vyhrazen právě pro kódovánísurrogate pairs), je takové kódování jednoznačné. 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; ve druhém případě se od kódu znaku nejdříve odečte0x010000):
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émpoř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ženBOM,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-16LE | 78 00 |
08 22 |
35 D8 44 DD
|
Výsledkem tedy je posloupnost šestnáctibitových hodnot0078 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]DleRFC 2781se kódují znaky definované normou ISO 10646 následovně:
- Znaky s hodnotou menší než0x010000jsou zakódovány přímo jako 16bitové celé číslo.
- U ostatních znaků (0x010000až0x10FFFF) se od jejich hodnoty odečte0x010000.Výsledkem je číslo v rozsahu0x000000až0x0FFFFF,které lze vyjádřit pomocí 20 bitů.
- Horních 10 bitů předchozího výsledku vyplní spodní bity 16bitového čísla0xD800(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 číslu0xDC00(spodních 10 bitů v něm je původně volných), čímž vznikne výslednýsurrogate pair).
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í:
- Pokud je hodnota menší než0xD800nebo větší než0xDFFF,jedná se o konečný výsledek.
- V opačném případě musí být hodnota v rozmezí0xD800až0xDBFFa je třeba přečíst dalších 16 bitů, které musí ležet v rozsahu od0xDC00do0xDFFF(pokud některá z přečtených hodnot leží mimo příslušný rozsah, nejedná se o platné UTF-16).
- 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ě0x010000a jedná se o konečný výsledek.
Využití
[editovat|editovat zdroj]UTF-16 se používá pro text v API v systémechMicrosoft Windows 2000/XP/2003/Vista/7/8/CE.[1]Starší systémyWindows NT(před Windows 2000) podporují pouze UCS-2.[2]VeWindows XPnejsou 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šíchkódových stránek.
iSeriessystémy firmyIBMpoužívajíkódovou stránkuCCSID13488 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émQualcomm BREW,prostředí platformy.NETi multiplatformní knihovna pro vytváření GUIQt.
Symbian OSpoužitý v telefonech Nokia S60 a Sony EricssonUIQpoužívá UCS-2. TelefonyiPhonepoužívají proSMSUTF-16 místo kódování UCS-2 popisovaného ve standardech3GPP TS 23.038aIS-637.[6]
Systém souborůJolietpoužívaný pro dlouhá jména souborů naCD-ROMpouží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žitpřekladtextu z článkuUTF-16na anglické Wikipedii.
- ↑Unicode (Windows).Retrieved 08 March 2011 "These functions use UTF-16 (wide character) encoding (…) used for native Unicode encoding on Windows operating systems."
- ↑Description of storing UTF-8 data in SQL Server[online]. microsoft.com, 2005-12-07 [cit. 2008-02-01].Dostupné online.
- ↑Unicode[online]. microsoft.com [cit. 2009-07-20].Dostupné online.
- ↑Surrogates and Supplementary Characters[online]. microsoft.com [cit. 2009-07-20].Dostupné online.
- ↑Character conversion[online].IBM[cit. 2012-05-22].Dostupné online.
- ↑Chad Selph.Adventures in Unicode SMS[online]. Twilio, 2012-11-08 [cit. 2015-08-28].Dostupné v archivupořízeném dne 2015-09-08.
Související články
[editovat|editovat zdroj]Externí odkazy
[editovat|editovat zdroj]- Obrázky, zvuky či videa k tématuUTF-16naWikimedia Commons
- RFC 2781:UTF-16, an encoding of ISO 10646
- Kapitola3.9 Unicode Encoding Formsve standardu Unicode