===== Karakter kódolás ===== 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. ==== UTF-8 kódolás ==== 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. ==== Base64 kódolás ==== 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. === Példa === 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.