UTF-8
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
editovatPř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 0x00 až 0x7F. 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 0xC0 až 0xFD a určuje, kolik bajtů následuje. Všechny následující znaky sekvence jsou v rozsahu 0x80 až 0xBF. 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ů
editovatKaž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í
editovatPř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.
Odkazy
editovatReference
editovat- ↑ RFC 3629: UTF-8, a transformation format of ISO 10646 [online]. The Internet Society, listopad 2003. Dostupné online.
- ↑ The Unicode Consortium. Unicode 4.0.0 [online]. Addison-Wesley, 2003 [cit. 2017-04-17]. Dostupné online.
- ↑ RFC 2044: UTF-8, a transformation format of Unicode and ISO 10646 [online]. The Internet Society, říjen 1996. Dostupné online.
- ↑ RFC 2279: UTF-8, a transformation format of ISO 10646 [online]. The Internet Society, leden 1998. Dostupné online.
Související články
editovatExterní odkazy
editovat- Obrázky, zvuky či videa k tématu UTF-8 na Wikimedia Commons