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 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.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.

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 = szám ábrázolható így, ami lefedi a Unicode szabványban definiált teljes spektrumot (U+0000-től U+10FFFF-ig, összesen 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 karaktert ábrázolni képes UTF-16 szabvánnyal való kompatibilitás.

BOM 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 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

További információk

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) Átfogó Unicode leírás

Kategória:Karakterkódolások Kategória:Internet

fi:Unicode#UTF-8