A Unicode (ISO-10646) egy roppant összetett, folyamatosan is bővülő szabvány, amelynek egy szűk része a karakterkódolási tábla, de most csak ezzel, ennek is csak a legeslegfőbb jellemzőivel foglalkozunk.
A Unicode megszünteti a rengeteg különböző karakterkészlet által keltett zűrzavart, hiszen, mint neve is mutatja, minden egyes karakter (betű, írásjel stb.) egyedi azonosító számmal rendelkezik.
Természetesen 256-nál nagyságrendekkel több karakter létezik, ennek megfelelően ezek a számok sokkal nagyobbak is lehetnek. Innen kezdve tehát nyilvánvalóan nem lehetséges mindegyik betűt 1 byte-on ábrázolni.
A régimódi karakterkészletek gyakorlatilag közvetlen megfeleltetést teremtettek a betűk és a byte-ok között, mint ahogyan azt az előző fejezetben is láttuk pár példán. Unicode rendszerben ez a megfeleltetés kétlépcsős. Vegyük továbbra is a „fűt” szót példának. Az „f” és „t” betű Unicode értéke az ASCII értékkel megegyezően 102, illetve 116. Az „ű” betű pedig a 369-es értéket kapta. Nyilvánvalóan a „fűt” szót reprezentáló képzeletbeli 102, 369, 116 Unicode számsorozatot nem tudjuk közvetlenül eltárolni 3 byte-on.
A Unicode-nak több ábrázolási módja is van, Linux rendszerek ezek közül az UTF-8 nevűt használják. Az UTF-8 kódolás szerint a 0–127 értékű karaktereket közvetlenül 1 byte-on ábrázoljuk saját értékükkel (ezzel garantálva az ASCII rendszerrel kompatibilitást), míg a nagyobb számértékű karaktereket 2, 3 vagy 4 egymást követő byte ír le (minél nagyobb a szám, annál több byte szükséges). (Az ilyen sorozatok első byte-ja mindig 192–253-ig terjed, és ennek a byte-nak az értékéből leolvasható, hogy hány további byte tartozik hozzá. A további byte-ok mind 128–191-ig terjednek. A Unicode érték és az UTF-8 bytesorozat közötti átalakítás szabályait elolvashatjuk például az „utf-8” kézikönyv oldalban is: terminálban adjuk ki a „man utf-8” parancsot.)
Az UTF-8 kódolás tehát a 102-es kódú „f” betűt 102-es byte-ként, a 116-os kódú „t” betűt pedig 116-os byte-ként, vagyis a korábbi kódolásokkal megegyezően fogja eltárolni. Ugyanakkor a 369-es kódú „ű” betűt, mivel 128-nál nem kisebb ez az érték, az itt nem részletezett szabályok szerint konkrétan a 197 177 bytesorozat fogja ábrázolni. Az UTF-8 karakterkészlet szerint tehát a „fűt” szót ez a számsorozat ábrázolja: 102, 197, 177, 116.
Érdekessége az UTF-8 kódolásnak, hogy egy véletlenszerűen összeállított bytesorozat valószínűleg nem érvényes UTF-8 kódolás, hiszen vannak bizonyos szabályok, melyeket egy ilyen fájlnak követnie kell. Például UTF-8 kódolású szöveg nem indulhat 128–191-ig terjedő byte-tal, illetve egy-egy karakter (1 karakter ugyebár több byte-ból is állhat) beolvasása után szintén nem következhet ilyen byte. Hasonlóan egy 192–253 értékű byte-ot viszont megfelelő számú 128–191 byte-nak kell követnie. 254-es és 255-ös byte egyáltalán nem fordulhat elő UTF-8 kódolású fájlban. Van még jó pár ehhez hasonlóan megfogalmazható szabály.
Gondoljunk vissza, a régi (például Latin-1, Latin-2) kódolásoknál ez nem így volt: tetszőleges fájl érvényes volt, hiszen byte-jait sorra vehettük, és mindegyik egy-egy írásjelet (vagy speciális karaktert) jelentett.
Ebből a szokatlan tulajdonságból előnyök és hátrányok is származnak.
Nem minden fájl vagy fájlnév érvényes az UTF-8 kódolás szerint. Ha Latin-2 kódolással létrehozunk egy szöveget (például a „fűt” fájlnevet), akkor azt egy olyan szoftver, amelyik mindenképp UTF-8 kódolásra számít, nem fogja tudni értelmezni, és nem kizárt, hogy esetleg egyáltalán nem is jeleníti meg, vagyis gondot okozhat számára az ilyen fájlok kezelése.
Előny viszont, hogy egy fájlról nagyon jó eséllyel meg tudjuk tippelni, hogy az UTF-8 kódolású-e vagy sem.
A régi kódolásokkal ez nincs így. Lehetetlenség eldönteni egy fájlról, hogy az Latin-1 vagy Latin-2 kódolásban áll-e, így is és úgy is értelmezhető bármelyik fájl. Persze más-más betűk követik egymást a kétfajta értelmezésben, így egy megfelelő nyelvismerettel rendelkező ember képes lehet eldönteni, hogy melyik értelmezés vezet valamely létező nyelven írt szöveghez, de ezt egy számítógép nem tudja megtenni.
Példaként vizsgáljuk meg az előző két számsorozatunkat, először a 102, 251, 116 bytesorozatot. Ez nem érvényes UTF-8 bytesorozat, hiszen az UTF-8 kódolás szerint a 251-es értéket további 4 darab 128–191 közti értéknek kellene követnie. A számsorozat Latin-1 értelmezésben a „fût”, Latin-2 értelmezésben pedig a „fűt” szót adja. Természetesen a számítógép nem tudja eldönteni, hogy a fájl készítője Latin-1 karakterkódolással készítette el a fájlt, és így abban kalapos ékezetnek kell lennie, vagy pedig Latin-2 karakterkészlettel, és így dupla ékezetnek kell szerepelnie az u betűn, de az UTF-8 lehetőségét el tudja vetni.
Másik példánk a 102, 197, 177, 116 bytesorozat. Ha ezt valaki Latin-1 szerint értelmezi, a „fűt” jelsorozatot kapja, ha Latin-2 szerint, akkor „fĹąt”-ként jelenik meg, míg ha UTF-8-ban értelmezi, akkor a „fűt” szót kapjuk. A számítógép ismét nem tudhatja, hogy melyik jelsorozat volt a felhasználó szándéka és ehhez milyen kódolást használt, de az a tény, hogy a fájl érvényes UTF-8 kódolású, roppant valószínűvé teszi, hogy ez a kódolás a jó választás.
Látható tehát, hogy amíg az UTF-8-at keverjük a régi karakterkészletekkel, addig szintén adódhatnak ékezetkezelési problémák, viszont mihelyst csak az UTF-8 kódolás marad fenn (márpedig ez a cél), minden ilyesmi probléma megszűnik.
Szerencsére a régimódi (Latin-2-es) magyar ékezetes betűkből sehogyan sem állítható elő olyan bytesorozat, amelyik UTF-8-ban is véletlenül épp értelmes volna. Ha tehát csak magyar nyelvű szövegeink vannak, vegyesen Latin-2 és UTF-8 kódolásban, akkor teljes bizonyossággal minden egyes ilyen szövegről (fájlról, fájlnévről...) el tudjuk dönteni, hogy ez a két kódolás közül melyikben áll.