UTF-8, UTF-16, Unicode, ASCII

A számítógépprogramozásnak – hasonlóan más szakmákhoz – megvan a maga tolvajnyelve: a programozók egymás közötti kommunikációját megkönnyíti, és nyomokban elősegíti az összetartozás kialakítását is.
Ahogyan a laikus ember nem érti az orvosokat vagy akár egy napellenzőgyár alkalmazottjának a beszédét úgy a programozással ismerkedő sem érti feltétlenül azt, amit egy számítógépprogramozó, informatikus mond.
Az egyik tanulónk javasolta, hogy írjunk az olyan szavakról, amiket az informatikusok használnak, de az ismerkedők még nem értenek. Ráadásul meg is lepett egy listányi szóval, amiből álljon itt az első téma.

Ha esetleg neked is van a tarsolyodban egy-két ismeretlen szó, küldd be nekünk bátran (info@studicore.hu), hátha a következő épp a te szavad lesz!

El kell mondjam, hogy az online tanfolyamunkban természetesen a programozástanuláshoz és programozáshoz szükséges szavakat, kifejezéseket, fogalmakat végigvesszük, ha még nem próbáltad ki a rendszerünket, de szeretnéd, első lépésként töltsd ki a tesztünket!

Azt szerintem már mindenki hallotta, hogy a számítógép egyesekkel és nullákkal dolgozik, meg hogy kettes számrendszert használ. Ami ebből most nekünk fontos, hogy alapvetően a számítógép számokkal dolgozik. Felmerülhet a kérdés, hogy hogyan is lesz akkor a számokból ikon, ablak, grafikon,… vagy egyáltalán egy betű, amit el tudunk olvasni. Az első része is elképesztően érdekes, de maradjunk most csak annál, hogy hogyan lesz a számokból (amit a számítógép kezel) betű (amiket akár most is olvasni tudsz).

A megoldás pedig az, hogy van a számítógépnek egy táblázata, amiben egymáshoz kapcsolja a számokat (mondjuk azt, hogy 65), azzal a kis piktogrammal, amit mi nagy A betűnek ismerünk fel. A számítógépnek amúgy elképzelése nincs arról, hogy ez a nagy A betű amúgy nekünk bármit is jelent, csak azt tudja, hogy ha megkérjük rá, hogy egy 65-ös számnak megfelelő piktogramot rajzolja ki, akkor előveszi a megfelelő táblázatot, és kinyomtatja az A betűt nekünk.

Honnan is jöhet amúgy ez a szám?

Pl. fájlokból. Ha megnyitjuk a notepad programot, és beleírunk egy A betűt, elmentjük, akkor kapunk egy 1 bájtos fájlt, amiben a 65-ös szám szerepel, amit ha megfelelő módon olvasunk vissza, akkor hozzátársíthatjuk az A szimbólumot, és akkor el tudjuk olvasni.

Miért pont az A és a 65-ös szám került egymáshoz?

Ez tulajdonképpen pont annyira esetleges, mint az, hogy olaszul az este az, hogy „sera”, angolul, hogy „evening”, magyarul meg hogy „este”. Ez egy választás volt, amit valahol valaki meghozott, a többiek meg átvették.
És ahogyan több beszélt nyelv is létezik, több ilyen szám-piktogram összerendelés is létezik. (Ezeket az összerendeléseket nevezik amúgy karakterkiosztásnak vagy kódtáblának, esetleg kódlapnak).

Az első, széles körben elterjedt ilyen kiosztás az ASCII volt, mely először a 0-127 közötti számokhoz határozta meg a kapcsolódó karaktereket (a piktogramok), majd kiegészítéssel végig fixálta a 0-255 tartományban, hogy milyen számhoz milyen karakter tartozik.

Alapvetően ez egy amerikai találmány volt, és arra szolgált, hogy az amerikaiak karaktertárolási igényeit kielégítse, tehát nem volt a karakterek között (eleinte) semmilyen ékezetes betű, majd a 255-ig való kibővítéskor beletettek néhányat a világ nyelveinek speciális karakterei közül. 128 jel azonban nem volt elegendő minden nemzet speciális betűinek tárolására, így kialakult több, egymással rivális, egymással nem kompatibilis (azaz nem együttműködő) kódlap. Erre az időre tehető a legnagyobb káosz: csak Magyarországon kb. ötféle egymással versengő kódlapot használtak az emberek (852, Windows-1252, Latin2…), és ebből a Windows is kétfélét (egy a terminálban („cmd-ablak”), egyet pedig a grafikus felületen, szóval a Windows még önmagával sem volt kompatibilis.

A káoszban rendet kellett tenni, de alapvetően a gond az volt, hogy nem volt elég hely új karaktereket eltárolni (a mostani számítógépek a 8 bináris számjegyből álló bájtot tekintik alapegységnek, ami 0-255-ig tud számokat tárolni, és azt rögzítette az ASCII, hogy minden karakter egy bájt lesz).

Mindenféleképpen több lehetőség kellett. Az első gondolat az volt, hogy akkor használjunk két bájtot minden karakter ábrázolásához, ez biztosít 65536 különböző lehetőséget, ami elég soknak tűnik. (Nem volt elég). Viszont van néhány probléma vele: az egyik, hogy minden szövegfájl kétszerannyi tárterületet foglal (most nem az 1 bájtos A betűt tartalmazó fájlunkat tekintve, ami így 2 bájt lesz, hanem inkább a több 10 megabájtos fájlok esetében lesz ez probléma). A másik probléma pedig az, hogy a notepad program nem fogja tudni egyáltalán kezelni az új fájlokat (legalábbis addig, amíg fel nem fejlesztik hozzá az új verzióban).

Ennek a megoldására jött létre az UTF-8, mint a Unicode karakterek leírási formátuma. Nem fixálja azt, hogy egy karaktert hány bájton kell leírni, tehát lehet 1, 2, …, és úgy hozták létre, hogy ha egy bájt egy karakter, akkor az megfelel annak az összerendelésnek, amit az eredeti, 128 jelet tartalmazó ASCII használt. Ennek következtében az ékezetes betűket nem tartalmazó UTF-8 kódolású szövegfájlt megnyitva egy nagyon-nagyon régi szövegszerkesztővel, azt el fogjuk tudni gond nélkül olvasni. (Az A betű ASCII és UTF-8 esetén a 65-ös bájtnak felel meg). Az ékezetes betűket a réges-régi, ASCII szövegszerkesztő pedig többkarakteres kriksz-kraksznak fogja ábrázolni.

Az UTF-16 esetében nincs opció arra, hogy egy karakter egyetlen bájtot foglaljon el, mindenképpen legalább 2 bájt egy karakter.

Minden világos volt? Ha nem, vagy kérdésed esetleg kifejtendő témád van, írj nekünk!

Pasztuhov Dániel
és a StudiCore csapata