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
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 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ů
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í
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.
Odkazy
Reference
- ↑ 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
Externí odkazy
- Obrázky, zvuky či videa k tématu UTF-8 na Wikimedia Commons
Média použitá na této stránce
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).