UTF-8
Unicode |
---|
UCS |
Az UTF-8 (8-bit Unicode Transformation Format, 8 bites Unicode átalakítási formátum) változó hosszúságú Unicode karakterkódolási eljárás, melyet Rob Pike és Ken Thompson alkotott meg. Bármilyen Unicode karaktert képes reprezentálni, ugyanakkor visszafelé kompatibilis a 7 bites ASCII szabvánnyal. Emiatt egyre inkább az internetes karakterkódolás standardjává válik.
Az angolszász, majd az európai országokból kiindulva az ASCII után először az úgynevezett Latin-1 kódolás terjedt el, ami tartalmazza az összes angol nyelvhez szükséges betűt, illetve számos európai nyelv betűit, de például a magyar „ő” és „ű” betűket nem (ezek helyett – helytelenül – gyakran használják a hullámos illetve a kalapos betűket: û ô vagy õ). Magyarhoz lehet azonban a Latin-2 (közép-európai) kódolást is használni, ami ismeri az ő és ű betűinket, de nem ismer más fontos betűket, például a cirill, görög, vagy például az örmény, indiai, arab és héber betűket, a kínai írásjegyeket és a japán kanákat. A Unicode és az UTF-8 kódolás egyszerre támogatja mindezen karakterek megjelenítését, és így minden nyelv egységes kódolást tud használni, megelőzve a betűk nem tervezett „átalakulását”.
Az UTF-8-kódolás lényege, hogy a 7 bites ASCII kódtábla karaktereit (angol kis- és nagybetűk, számok és gyakoribb írásjelek) az ASCII-kódjukkal jelöli, az egyéb karakterek kódját pedig „feldarabolja”, és a darabokat egy vezérlőjelet követő több, egymás utáni bájtban helyezi el úgy, hogy a bájtok mindegyike 127 felett van (azaz így nem téveszthető össze a 7 bites ASCII-kódok egyikével sem). Ennek számos előnye van: a 7 bites ASCII-szöveg UTF-8-kódja saját maga, illetve az UTF-8 szöveget tévesen valamilyen más elterjedt kódolásnak (például ISO-8859-1-nek) értelmezve általában nem kapunk nagyon rossz eredményt (magyar szöveg esetén csak az ékezetes karakterek, a gondolatjel és egyéb speciális tipográfiai jelek helyén lesz két-két értelmetlen karakter), a félbeszakadt UTF-8 karakterről egyértelműen felismerhető, hogy hibás, és a nagyrészt ASCII-szöveg kódolása nem igényel sok extra bájtot.
Működése
[szerkesztés]Az UTF-8 kód bináris alakban 0-val kezdődő bájtjai 7 bites ASCII karaktereket jelölnek, a 11-gyel kezdődőek több bájtos karakterkód-szekvencia kezdetét, az 10-val kezdődőek pedig a folytatását. A karakterkód-szekvenciát indító bájt elején álló egyesek száma megadja, hány bájtból áll a szekvencia, ezután egy 0 jön, a fennmaradó helyen és a követő bájtok fennmaradó 6 helyén lévő biteket összefűzve kapjuk a jelölt karakter Unicode azonosító számát. Más szóval, ha a Unicode azonosítót 4 bájton ábrázoljuk (balra növekvő helyiértékekkel), akkor az UTF-8 kódolását az alábbi táblázat első olyan sora fogja megadni, amelynek a bal oldalán lévő minta ráillik a négybájtos számra.[megj 1]
00000000 00000000 00000000 0xxxxxxx | 0xxxxxxx |
00000000 00000000 00000yyy yyxxxxxx | 110yyyyy 10xxxxxx |
00000000 00000000 zzzzyyyy yyxxxxxx | 1110zzzz 10yyyyyy 10xxxxxx |
00000000 000wwwzz zzzzyyyy yyxxxxxx | 11110www 10zzzzzz 10yyyyyy 10xxxxxx |
Összesen 221 = 2 097 152 szám ábrázolható így, ami lefedi a Unicode szabványban definiált teljes spektrumot (U+0000-től U+10FFFF-ig, összesen 1 114 112 karakter). Bár az UTF-8 kódolás logikája kiterjeszthető lenne 6 vagy akár 7 bájtos szekvenciákra is, és az UTF-8-at definiáló korábbi ISO/IEC 10646 szabvány még maximum 6 bájtos szekvenciákat írt elő, a jelenleg érvényes Unicode szabvány szerint csak a legfeljebb 4 bájtos szekvencia számít helyes UTF-8 kódolásnak. Ennek oka a csak 1 112 064 karaktert ábrázolni képes UTF-16 szabvánnyal való kompatibilitás.
BOM
[szerkesztés]Egyes windowsos programok a fájl elejére írt 0xEF,0xBB,0xBF bájtsorozattal jelzik, hogy UTF-8 kódolású fájlról van szó; ezt néha UTF-8 BOM kódolásnak hívják. Ez a bájtsorozat ugyanis az U+FEFF Unicode-azonosítójú bájtsorrend-jel (angolul byte order mark, röviden BOM) UTF-8 kódja; a BOM karakter normális esetben UTF-16 kódolás elején állva azt jelzi, hogy a kétbájtos számok kisebb vagy nagyobb helyiértékű bájtja van-e elöl. (UTF-16-ban ugyanis az U+FEFF karakter kódja 0xFE,0xFF, a két bájt felcserélésével kapott 0xFF,0xFE pedig nem érvényes UTF-16 kód.) UTF-8-ban ennek a karakternek elméletileg nincs jelentése, így használható a kódolás jelzésére, azonban ez megtöri az ASCII-kompatibilitást, így nem javasolt. Az így kódolt PHP fájlok például a weboldal elején megjelenő  karaktersorozatot eredményeznek.
Elterjedése
[szerkesztés]Alapértelmezett kódolásként meglehetősen elterjedt Linux rendszereken, de a Microsoft Windows rendszer XP-től fölfelé is teljeskörűen támogatja.
Az IETF (Internet Engineering Task Force) minden internetprotokolltól megköveteli, hogy az általa használt kódolások között szerepeljen az UTF-8. Az IMC (Internet Mail Consortium) javaslata szerint minden e-mail kliensnek meg kell tudni jeleníteni az UTF-8 kódolású leveleket, és létre kell tudnia hozni azokat.
Megjegyzések
[szerkesztés]- ↑ A Unicode szabvány kifejezetten tiltja a dekódolók számára a szükségesnél hosszabb kódszekvenciák elfogadását, mert ezekkel esetleg ki lehetne játszani az UTF-8 szövegre alkalmazott szűrőket. Például az 11000000 10111100 és a 00111100 is a bináris 00111100 ASCII-kódú „<” jelnek felelne meg (amelynek a szűrésével gyakran védekeznek az XSS támadások ellen), de egy helyesen működő UTF-8 dekódolónak csak az utóbbit szabad elfogadnia.
További információk
[szerkesztés]- Hivatalos definíció a Unicode 5.2 szabványban (bitkódolás táblázata a 93. oldalon)
- Hivatalos definíció a Unicode 13.0 szabványban (bitkódolás táblázata a 124. oldalon)