UTF-8

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

UTF-8 je zkratka pro UCS Transformation Format. Je to způsob kódování řetězců znaků Unicode/UCS do sekvencí bajtů. Zatímco varianta UTF-16 kóduje řetězce do posloupností 16bitových slov (2 bajty) a varianta UTF-32 do 32 bitových slov (4 bajty), UTF-8 používá proměnnou délku znaku, a to od 1 bajtu až do 6 bajtů. Byl navržen pro zpětnou kompatibilitu s ASCII, se kterým tak má totožný způsob kódování 1-bajtových znaků. UTF-8 je definováno v ISO 10646-1:2000 Annex D, v RFC 3629 a v Unicode 4.0.

Důvody vzniku, základní vlastnosti[editovat | editovat zdroj]

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 až 6 bajtů dlouhé, 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.
  • Při respektování RFC 3629 se z UTF-8 využijí max. 4bajtové sekvence.

Způsob kódování znaků[editovat | editovat zdroj]

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. Pro kód znaku musí být použita nejkratší možná sekvence bajtů. Počet jedničkových bitů na začátku prvního bajtu ve vícebajtové sekvenci odpovídá počtu bajtů sekvence. Podle standardu je legální UTF-8 znak definován maximálně šesti bajty.

U+00000000 - U+0000007F 0xxxxxxx
U+00000080 - U+000007FF 110xxxxx 10xxxxxx
U+00000800 - U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 - U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U+00200000 - U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U+04000000 - U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

V listopadu 2003 však bylo UTF-8 omezeno RFC 3629 na U+10FFFF kvůli shodnému omezení s UTF-16. Pěti- a šestibajtové kódování znaku se tedy nevyskytuje.

Související články[editovat | editovat zdroj]