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ů. Varianta UTF-16 kóduje řetězce do posloupností 16bitových slov (2 bajty), Varianta UTF-32 do 32 bitových slov (4 bajty). UTF-8 je definováno v ISO 10646-1:2000 Annex D, v RFC 3629 a v Unicode 4.0.

Obsah

[editovat] 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 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ší byte 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.

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

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ě čtyřmi bajty.

U+00000000 - U+0000007F 0xxxxxxx
U+00000080 - U+000007FF 110xxxxx 10xxxxxx
U+00000800 - U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 - U+0010FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

[editovat] BOM

Split-arrows.svg
Bylo navrženo, aby byl článek rozdělen a aby byla tato kapitola přenesena do nového článku s názvem Byte order mark. (diskuse)
BOM
(hexa)
Velikost
prostoru Unicode
Kódování velikost
atomu
(B,1B=8b)
počet
atomů
maximální
délka znaku
(B,1B=8b)
EF BB BF 21b, větší než BMP UTF-8 1B 1 až 4 4B
FE FF 32b, větší než BMP UTF-16, varianta UTF-16BE, (big-endian) 2B 1 až 2 4B
FF FE 32b, větší než BMP UTF-16, varianta UTF-16LE, (little-endian) 2B 1 až 2 4B
00 00 FE FF 32b, větší než BMP UTF-32, varianta UTF-32BE, (big-endian) 2B 2 4B
FF FE 00 00 32b, větší než BMP UTF-32, varianta UTF-32LE, (little-endian) 2B 2 4B
EF BB BF 31b, větší než BMP UTF-8, rozšíření 1B 1 až 6 6B
FE FF 16b, právě BMP UCS-2, varianta UCS-2BE, (big-endian) 2B 1 2B
FF FE 16b, právě BMP UCS-2, varianta UCS-2LE, (little-endian) 2B 1 2B
- 8b, menší než BMP ASCII + code page 1B 1 1B
- 7b, menší než BMP ASCII 1B 1 1B

Znak s kódem U+FEFF (v desítkové soustavě 65279) se nazývá BOM (Byte order mark, česky přibližně „označení pořadí bajtů“), někdy také „UTF signatura“. V kódování UTF-8 je tento znak reprezentován trojicí bajtů 0xEF 0xBB 0xBF, v kódování UTF-16 big-endian dvojicí bajtů 0xFE 0xFF a v UTF-16 little-endian 0xFF 0xFE. Grafický význam znaku je „nedělitelná mezera nulové šířky“ (zero-width no-break space), je tak podobný znaku U+2060 (word joiner). [1] Hlavním důvodem užití tohoto znaku je rozlišení pořadí ukládání bajtů big-endian nebo little-endian v UTF-16 a odlišení samotného UTF-16 od UTF-8. V případě záměny pořadí bajtů není znak U+FFFE platný Unicode znak, navíc v kódování UTF-8 se bajty 0xFE a 0xFF nesmí vyskytovat. Užití BOM v UTF-8 je pro účel rozpoznání pořadí ukládání bajtů nadbytečné, nicméně množství aplikací operačního systému Microsoft Windows používá tento znak na začátku souboru pro rozlišení souborů uložených ve formátu UTF-8. V některých systémech (POSIX) není tato signatura používána a může být zdrojem problémů.

[editovat] Související články

Osobní nástroje
Jmenné prostory
Varianty
Akce
Navigace
Tisk/export
Nástroje
V jiných jazycích