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.

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í).

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

editovat

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ů

editovat

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 1 Bajt 2 Bajt 3 Bajt 4 Bitů x Kódových bodů První kódový bod Poslední kódový bod Kódované znaky
1 0xxxxxxx 7 128 U 0000 U 007F ASCII – anglická abeceda a základní znaky
2 110xxxxx 10xxxxxx 11 1920 U 0080 U 07FF Varianty latinky vč. české, další abecedy (řecká, cyrilice, hebrejská, arabská atd.)
3 1110xxxx 10xxxxxx 10xxxxxx 16 63 tisíc U 0800 U FFFF Ostatní znaky základní roviny Unicode vč. běžných východoasijských znaků
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 21 přes milion U 10000 U 10FFFF Ostatní 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.

Overlong kódování

editovat

Přestože ve výše uvedené tabulce ve sloupci „První kódový bod“ jsou u vícebajtových kódů uvedena nenulová čísla, ve skutečnosti by bylo možné pomocí vícebajtových posloupností kódovat znaky i s nižšími kódy; například znak Euro U 20AC (binárně 0010 0000 1010 1100) v UTF-8 normálně kódovaný třemi bajty (šestnáctkově E2 82 AC, binárně 11100010 10000010 10101100) by mohl být kódován čtyřmi bajty F0 82 82 AC, binárně 11110000 10000010 10000010 10101100. Norma UTF-8 však takové kódování nazývané anglicky overlong encoding zakazuje.

Reference

editovat
  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

editovat

Externí odkazy

editovat