UTF-8

Podrobné schéma kódování UTF-8. Obsahuje číslování bitů a přesnou pozici každého bitu. Toto schéma neobsahuje žádné lokalizované značky (vhodné pro mezinárodní použití).

UTF-8 (zkratka pro UCS/Unicode Transformation Format) je jedním ze způsobů kódování znaků, tedy přiřazení číselných kódů znakové sadě (písmenům abecedy a dalším znakům) pro potřeby počítačového zpracování textů. Představuje rozšířený mezinárodní standard dle norem Unicode/ISO/IEC 10646 a dominantní způsob kódování na internetovém webu, který umožňuje ukládat a zobrazovat texty s použitím široké palety světových písem.

Používá proměnnou délku znaku od 1 do 4 bajtů, zatímco standardy UTF-16 a UTF-32 mají pevnou délku 2 a 4 bajty (16 a 32 bitů). Byl navržen pro zpětnou kompatibilitu s ASCII, které obsahuje jen základní sadu anglické abecedy a se kterým má totožný způsob kódování 1bajtových (7bitových) znaků. UTF-8 je definováno v ISO 10646-1:2000 Annex D, v RFC 3629[1] a v Unicode 4.0[2].

Důvody vzniku, základní vlastnosti

Přirozené kódování znaků Unicode/UCS do 2 nebo 4 bajtů se nazývá UCS-2/UTF-16 a UCS-4/UTF-32. Pokud se nespecifikuje jinak, ukládá se nejprve nejvýznamnější bajt (tzv. konvence big-endian). S řetězci uloženými ve formátu UCS-2 nebo UCS-4 je spojeno několik problémů:

  • UCS-2 a UCS-4 nejsou zpětně kompatibilní s formátem ASCII
  • Nejednoznačnost interpretace kvůli neurčené endianitě
  • Uložení textu v latince je několikanásobně náročnější na paměť.
  • Některé bajty v řetězci mohou obsahovat binární nuly, které mají zvláštní význam v některých programovacích jazycích.
  • Některé bajty mohou obsahovat znaky, které mají zvláštní význam pro operační systém (např. „/“, „\“).

Z uvedených důvodů nejsou formáty UCS-2 a UCS-4 vhodné pro ukládání do souborů.

Tyto problémy řeší kódování UTF-8, které má následující vlastnosti:

  • UCS znaky U+0000 až U+007F jsou kódovány jednoduše jako bajt 0x000x7F. To znamená, že řetězce obsahující pouze ASCII znaky mají shodné kódování v UTF-8 i v ASCII.
  • Všechny znaky větší než U+007F jsou kódovány jako sekvence několika bajtů, z nichž každý má nastaven nejvyšší bit na jedničku. To znamená, že bajty nemohou být zaměněny s žádným ASCII znakem.
  • První bajt sekvence, která reprezentuje ne-ASCII znak, je vždy v rozsahu 0xC00xFD a určuje, kolik bajtů následuje. Všechny následující znaky sekvence jsou v rozsahu 0x800xBF. To umožňuje snadnou synchronizaci a odolnost proti ztrátě některých bajtů.
  • Může být kódován celý rozsah UCS 231 znaků.
  • Zakódované znaky mohou být dlouhé až 4 bajty (v původní verzi až 6 bytů), ale základní 16bitové znaky BMP (basic multilingual plane) jsou jen 1 až 3 bajty dlouhé.
  • Pořadí big-endian (nejvýznamnější bajt ukládán jako první) je zachováno.
  • Bajty s hodnotou 0xFE a 0xFF nejsou nikdy použity.

Způsob kódování znaků

Každému z více než milionu znaků (písmových i řídicích) je přiřazeno číslo – tzv. kódový bod – a čím je toto číslo vyšší, tím je potřeba k jeho kódování více bajtů. V každém bajtu jsou nejvýznamnější bity příznakové a indikují, kolik bajtů je pro zapsání znaku použito, zatímco zbývajícími bity je zapsán vlastní kód znaku. Pro přepis kódu znaku se používá formát U+XXXX, kde XXXX je hexadecimální kód znaku, tedy každá číslice (X) šestnáctkové soustavy odpovídají čtyřem bitům (polovině bajtu).

Následující tabulka ukazuje způsob kódování. Pokud je nejvýznamnější bit bajtu 0 (hodnoty 0–127), jedná se o jednobajtový kód dle tabulky ASCII. V ostatních případech jsou rozhodující bity na začátku prvního bajtu: počet jedničkových bitů zakončených nulou (110–11110) odpovídá počtu bajtů sekvence (2–4), ostatní bajty začínají bity 10. Ostatní bity v sekvenci (označené xxx) slouží k vyjádření vlastního kódového bodu (kódu znaku). Počet n těchto bitů určuje (teoretický) počet 2n kódových bodů, tedy znaků, které lze touto sekvencí kódovat.

Počet bajtůBajt 1Bajt 2Bajt 3Bajt 4Bitů xKódových bodůPrvní kódový bodPoslední kódový bodKódované znaky
10xxxxxxx7128U+0000U+007FASCII – anglická abeceda a základní znaky
2110xxxxx10xxxxxx111920U+0080U+07FFVarianty latinky vč. české, další abecedy (řecká, cyrilice, hebrejská, arabská atd.)
31110xxxx10xxxxxx10xxxxxx1663 tisícU+0800U+FFFFOstatní znaky základní roviny Unicode vč. běžných východoasijských znaků
411110xxx10xxxxxx10xxxxxx10xxxxxx21přes milionU+10000U+10FFFFOstatní roviny Unicode: méně používané znaky, emoji

Podle původní definice byl jeden znak v UTF-8 reprezentován jedním až šesti bajty.[3][4] V listopadu 2003 byl rozsah kódů ISO/IEC 10646 omezen na U+10FFFF kvůli shodnému omezení s UTF-16, RFC 3629 již popisuje UTF-8 s tímto omezením.

Odkazy

Reference

  1. RFC 3629: UTF-8, a transformation format of ISO 10646 [online]. The Internet Society, listopad 2003. Dostupné online. 
  2. The Unicode Consortium. Unicode 4.0.0 [online]. Addison-Wesley, 2003 [cit. 2017-04-17]. Dostupné online. 
  3. RFC 2044: UTF-8, a transformation format of Unicode and ISO 10646 [online]. The Internet Society, říjen 1996. Dostupné online. 
  4. RFC 2279: UTF-8, a transformation format of ISO 10646 [online]. The Internet Society, leden 1998. Dostupné online. 

Související články

Externí odkazy

Média použitá na této stránce

UTF-8 Encoding Scheme.png
Autor: Callidus, Licence: CC BY-SA 3.0
Detailed scheme of the UTF-8 encoding. Includes bits numbering and exact position of every bit. This scheme doesn't contain any localized labels (suitable for international use).
Warning: this describes an old non-standard extension to support code points using up to 31-bit, all encodable to at most 6 bytes (such extension is no longer valid since the publication of ISO/IEC 10646:2003, The Unicode Standard 4.0, and the current RFC 3629 in the IETF Standard Tracks, that are restricting valid code points to the first 17 planes using at most 21 bits, all encodable into at most 4 bytes with more restricted valid values). Old applications depending on the older definitions by ISO/IEC 106464-1 or older RFCs, and still needing such extension to encode more planes, must not label this usage with "UTF-8", but may use "FSS-UTF" (which also has a distinct ASN OID).