A betűkarakterek egységes kódjának létrehozása a műszaki kommunikáció nagy eredménye. Kezdetben az Amerikai Szabványhivatal egy 7 bites kódot szabványosított ASCII (American Standard Code for Information Interchange) néven. Ez a kód az angol ABC 26 nagy és kisbetűjét, a számjegyeket, írásjeleket, és az un. vezérlő karaktereket tartalmaz. Ez utóbbiak az írás formátumának vezérlésére és az egyes alkalmazások vezérlésére szolgáltak. A betűkarakterek kódját később ki kellett bővíteni. Részben a különböző nyelvek ékezetes és egyéb karakterei, részben a matematikai szimbólumok, illetve speciális grafikus karakterek miatt. Ez a 8 bites karakterkód az ANSI kód nevet kapta (American National Standards Institute). A korai szövegszerkesztők széles körben használták az IBM Code Page 852 nevű kódot. Ez tartalmazza a magyar nyelv 18 ékezetes betűkarakterét is.
ISO-8859-1 (Latin-1) A nyugat európai ékezetes karaktereket kódolnak ISO-8859-2 (Latin 2) Kelet európai készlet. A magyar nyelv speciális jeleit is tartalmazza: ű,ő.
Az ISO-10646 szabvány definiál egy univerzális karakter halmazt (UCS – Universal Character Set). Biztosítja, hogy nem lesz információvesztés, ha egy tetszőleges írásjelet átalakítunk UCS-re majd vissza az eredeti kódolására (www.unicode.org). UCS tartalmazza az összes ismert nyelv írásjeleit. Nem csak a ma használatosakat, hanem a történeti népek holt nyelveinek jeleit is. Továbbá az ismert matematikai, tudományos szimbólumokat is. A szabvány folyamatosan bővül. A szabványt 1993-ban publikálták először (ISO-10646-1). Eredetileg 31 bites kódolás. A 0x0000 és 0xFFFD terjedő 16 bites tartományt Basic Multilingual Plane-nek (BMP-nek) nevezzük.
A szabvány ISO 10646-2 változata 2001-ben jelent meg. A BMP-n kívüli tartományt tartalmazza. 2003-ban a két halmazt egyesítették a ISO 10646-ban.
Az UCS (unicode) szabvány szerint a kódolt karakterek nem csak egy számmal, hanem névvel is rendelkeznek. Az UCS kód szabványos előtagja az U+. Például U+0041 jelentése „Latin capital letter A”. Az U+0000 és U+007F közötti tartomány megfelel az ASCII 7 bites változatának. Az U+0080 és U+00FF tartomány a Latin-1-nek felel meg.
A különbség az ISO és a Unicode között az, hogy ameddig az ISO 10646 egy kódtáblázatot jelent, addig az Unicode ezen felül tartalmaz tipográfiai szabványokat is. Megjelenítési eljárásokat (Arab, Héber írásjelekhez), több irányú szövegek kezelését egy dokumentumon belül, valamint rendező és szöveg összehasonlító algoritmusokat.
Az UTF kódolások lényege az, hogyan tudjuk a 32 bites unicode karakterek kódolását rövidíteni, hogy ne legyen 1 leütés 4 byte hosszú.
Az alábbi táblázatból és a későbbi magyarázatból megérthető, hogyan használható az UTF-8 kódolás:
Unicode | UTF-8 |
---|---|
00000000 00000000 00000000 0xxxxxxx | 0xxxxxxx |
00000000 00000000 00000yyy yyxxxxxx | 110yyyyy 10xxxxxx |
00000000 00000000 xxxxxxxx xxxxxxxx | 1110xxxx 10xxxxxx 10xxxxxx |
00000000 000xxxxx xxxxxxxx xxxxxxxx | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
000000xx xxxxxxxx xxxxxxxx xxxxxxxx | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
A 7 bites ASCII kódokat változtatás nélkül kódoljuk. Az UTF-8 kódolás első bájtjában annyi 1-es szerepel az első 0 előtt, ahány bájt fogja követni az elsőt.
A ’ó’ Unicode kódja a decimális 243, azaz hexadecimális 0x00F3, bináris 00000000 00000000 00000000 11110011
. A második szabályra húzható rá (mivel az első csak 7 bitet kódolhat), tehát UTF-8 kódja bináris 11000011 10110011
, vagyis egy decimális 195, azaz hexadecimális 0xC3, majd ezt követően egy decimális 179, azaz hexadecimális 0xB3 byte.
Az UTF-16 os kódolást a Windows operációs rendszer és a Microsoft Office csomag előszeretettel használja. Lényege nagyon durván leegyszerűsítve annyi, hogy 2 byte kódol minimum egy unicode karaktert, és jelezheti a két bit sorrendjét is az állomány elején.
Megjegyzés: Az UTF-16 kódolás előírja, hogy a byte-sorrendet jelezni kell egy úgynevezett byte-sorrend jelző (byte order mark, BOM) segítségével, amelynek meg kell előznie a tényleges szöveget. Notepad++-ban ez látszik is, egyes szöveges állományok elején. A BOM-ként használt karakter a „nulla szélességű nem törhető szóköz”, amely értelemszerűen sosem fordul elő eredeti jelentéstartalmával szöveg elején. Unicode száma hexadecimálisan FEFF; az FE FF byte-sorozat jelenti a „big-endian”, azaz „nagy végű”, és az FF FE sorozat jelenti a „little-endian”, azaz „kis végű” byte-sorrendet.
Ez valójában nem karakter kódolás, de didaktikailag ide illik.
Multipurpose Internet Mail Extensions (MIME) az internet hivatalos levélformátuma. A levelek az SMTP (Simple Mail Transfer Protocol) protokoll segítségével továbbítódnak a címzetthez. Az SMTP protokoll csak 7 bites ASCII karakterek továbbítását támogatja. A MIME szabvány többféle módszert támogat a bináris adatok továbbításához. Az egyik legismertebb a Base-64 kódolás.
A következő példában egy melléklettel rendelkező email-t láthatunk, azaz a forrásadatot amit a levelező programok értelmeznek:
Content-type: multipart/mixed; boundary="frontier" MIME-version: 1.0 --frontier Content-type: text/plain This is the body of the message. --frontier Content-type: application/octet-stream Content-transfer-encoding: base64 gajwO4+n2Fy4FV3V7zD9awd7uG8/TITP/vIocxXnnf/5mjgQjcipBUL1b3uyLwAVtBLOP4nV AhSzlZnyLAF8na0n7g6OSeej7EjlF/aglS6ghfju FgRr+OX== --frontier--
Hátulról a második és harmadik sorban láthatóak base64 kódolt adatok. Nézzük hogyan jön ez létre.
Base64 kódolás (vagy általánosabban adat reprezentáció) egy 64 jelből álló készleten alapul. Olyan, mintha 64-es számrendszerbe írnánk át az adatainkat. A kódolást 6 bites csoportokon végezzük.
0..25 – 'A' .. 'Z' 26..51 – 'a' – 'z' 52..61 – '0' – '9' 62 – '+' 63 – '/'
Azaz 0 és 25 között használjuk az angol ABC első 26 nagybetűjét, majd 26 és 51 között a kisbetűket, valamint 52-61-ig a számokat majd a maradék 2 kódhelyre a + és / jelek kerülnek. Így összesen 64 féle szimbólumot adtunk meg.
Kódoljuk a következő bináris adatot Base-64 kódolás szerint:
001100110011
Bontsuk fel két 6 bites részre:
001100
, 110011
Ezek decimálisan 12 és 51. A táblázat alapján: 12 = M és 51 = z
Az eredmény:
Mz
A Base-64 kódolás 3 byte-onként történik és 3 byte kódolt eredménye 4 karakter lesz. Hogyan kódolunk, ha a kódolandó bájtok száma nem osztható 3-al? (ilyen kor 1 vagy 2 db egyenlőséggel jelöljük ezeket az eseteket az alábbi példák alapján)
Kódoljuk a 00000001
-t (ami 1 byte):
1. Egészítsük ki 3 byte-ra 00000001
00000000
'00000000
2. Bontsuk fel 6 bites csoportokra:
000000 010000 000000 000000 , és nézzük ki a táblázatból a karaktereket.
3. Az eredmény
AQ==
Most pedig kódoljuk a
00000010
00000001-t (ami 2 byte adatot jelent):
1. Egészítsük ki 3 byte-ra
00000010
00000001
00000000
2. Bontsuk fel 6 bites csoportokra:
000000 100000 000100 000000
3. Az eredmény
AgE=''
Base-64 dekódolás: 4 karakterenként visszafelé majd 8 bitenként csoportosítva. Az egyenlőség jelek száma alapján el lehet dönteni, hogy az utolsó 6 vagy 12 bitet figyelembe kell-e venni.
A kódolás fontos előnye, hogy sortörő karaktert is tartalmazhat. (minden olyan karaktert is, ami a kódtáblázatból hiányzik). De a dekódolásnál ezt figyelembe kell venni.