Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Karakter kódolások UCS, UTF, Base 64 Dr. Nehéz Károly egyetemi adjunktus Miskolci Egyetem Alkalmazott Informatikai Tanszék 2005 1.

Hasonló előadás


Az előadások a következő témára: "Karakter kódolások UCS, UTF, Base 64 Dr. Nehéz Károly egyetemi adjunktus Miskolci Egyetem Alkalmazott Informatikai Tanszék 2005 1."— Előadás másolata:

1 Karakter kódolások UCS, UTF, Base 64 Dr. Nehéz Károly egyetemi adjunktus Miskolci Egyetem Alkalmazott Informatikai Tanszék 2005 1

2 Áttekintés ASCII – 60-as években fejlesztették. 128 különböző jelet kódolhat. 8 bites kódolások – ASCII-vel visszafelé kompatibilis kódolások. 128-255-ig terjedő kódok különböző ékezetes betűket kódolnak. A probléma: az élő nyelvekben 128- nál többféle ékezetes írásjelet, betűt használnak. - 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: ű,ő. Gyakori problémák: (amennyiben a karakterkódolást nem tartalmazza a dokumentum) - Ô – Ő, @ - Š összekeveredhetnek.

3 UCS és ISO10646 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. - ISO 10646-2 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 USC 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+ –U+0041 – „Latin capital letter A”

4 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 80-as évek végére két szervezet egymástól függetlenül próbált létrehozni egységes karakterkészletet. ISO és a Unicode Project. 1991 után összefogtak és kidolgoztak egy közös kódtáblát. A két szervezet mind a mai napig kiadja az újabb változatokat de az ISO 10646- szabvánnyal továbbra is kompatibilisek a változások. –ISO 10646-1:1993 --- Unicode 1.1 –ISO 10646-1:2000 --- Unicode 3.0 –ISO 10646-2:2001 --- Unicode 3.2 –ISO 10646:2003 --- Unicode 4.0 Minden Unicode verzió a 2.0-tól kompatibilis, azóta csak újabb karaktereket adtak a szabványhoz, a meglévőket nem módosították. 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.

5 UTF-8 kódolás UnicodeUTF-8 00000000 00000000 00000000 0xxxxxxx0xxxxxxx 00000000 00000000 00000yyy yyxxxxxx110yyyyy 10xxxxxx 00000000 00000000 xxxxxxxx xxxxxxxx1110xxxx 10xxxxxx 10xxxxxx 00000000 000xxxxx xxxxxxxx xxxxxxxx11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 000000xx xxxxxxxx xxxxxxxx xxxxxxxx111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx A 7 bits ASCII kódokat változtatás nélkül kódoljuk. Az UTF 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 hexa 0xC3, majd ezt követően egy decimális 179, azaz hexadecimális 0xB3 byte.

6 UTF-16 kódolás Az Unicode v 3.0 szabvány része A karakterek 1 vagy 2 darab 16 bites, előjel nélküli, egész értékként lesznek kódolva, a karakter értékétől függően. Szabályok: –Ha a kódolandó karakter értéke kisebb mint 0x10000, akkor 1 db 16 bites előjel nélküli egészként lesz tárolva. –Ha a kódolandó érték 0x10000 és 0x10FFFF között van, akkor két 16 bites értékkel tárolják le. Az első 0xD800 és 0xDBFF közötti egész, a második 0xDC00 és 0xDFFF közötti egész lesz. –Ha a karakter értéke nagyobb mint 0x10FFFF akkor nem lehet UTF-16 kódolással kódolni. Megjegyzés: A 0xD800 és 0xDFFF közötti értékek az UTF-16 számára foglaltak az unicode nem definiál karaktereket a fenti tartományban. UTF-16BE (Big Endian), UTF-16LE (Little Endian)

7 UTF-16 kódolás Legyen U a kódolandó karakter, tegyük fel, hogy U<0x10FFFF 1.Ha U < 0x10000, kódold U-t egy 16-bites előjel nélküli egészként. GOTO 5. 2.Legyen U' = U - 0x10000. Mert U kisebb vagy egyenlő mint 0x10FFFF, U‘-nek kisebbnek, vagy egyenlőnek kell lennie mint 0xFFFFF. Ebből következik, hogy U' felírható 20 bittel. 3.Legyen W1 és W2, a következő két 16 bites egész értékek 0xD800 és 0xDC00. E két érték rendelkezik 10-10 szabad bittel a kódoláshoz. 4.Az U’ felső 10 bitjét ‘rendeld hozzá’ W1-hez és az alsó 10 bitjét W2-hez vagy műveletekkel. A kódolt értékek W1 és W2 lesznek. 5.Vége. U' = yyyyyyyyyyxxxxxxxxxx W1 = 110110yyyyyyyyyy W2 = 110111xxxxxxxxxx utf16(c) { if (c > 0xFFFF) { putwchar (0xD7C0 + (c >> 10)); putwchar (0xDC00 | c & 0x3FF); }

8 UTF-16 dekódolás Legyen W1 a következő 16 bites egész a szöveget leíró bájtsorozatból. Legyen W2 az ezt követő 16 bites egész. 1.Ha W1 0xDFFF, a karakter értéke U=W1 Vége. 2.Ellenőrizd, hogy W1 0xD800 és 0xDBFF között van. Ha nem tejesül a feltétel, akkor hiba történt az átvitelben. Vége. 3.Ha nincs W2, (azaz a W1 volt az utolsó karakter a sorban), vagy W2 nincs 0xDC00 és 0xDFFF között akkor az átvitelben hiba történt. Vége. 4.Legyen U’ 20-bites előjelnélküli egész. U’-t képezzük W1 és W2 alsó 10-10 bitjéből. 5.Adjunk hozzá 0x10000-t U‘-hez. A kódolt karakter: U = U’+0x10000

9 Példák Kódoljuk a v = 0x64321 karaktert UTF-16 kódolással. v′ = v - 0x10000 = 0x54321 = 0101 0100 0011 0010 0001 vh = 0101010000 // v′ felső 10 bit-je vl = 1100100001 // v′ alsó 10 bitje w1 = 0xD800 // konstans 1 w2 = 0xDC00 // konstans 2 w1 = w1 | vh = 1101 1000 0000 0000 | 01 0101 0000 = 1101 1001 0101 0000 = 0xD950 w2 = w2 | vl = 1101 1100 0000 0000 | 11 0010 0001 = 1101 1111 0010 0001 = 0xDF21 Az eredmény: 0xD950 0xDF21

10 KódKarakterUTF-16 27700 (0x6C34)víz jele, Kínai6C34 122 (0x7A)Kis latin z.007A 119070 (0x1D11E)Violin ‘G’ kulcsD834 DD1E Kódolás megnevezése Byte sorrendByte sorozat UTF-16LELittle endian34 6C, 7A 00, 34 D8 1E DD UTF-16BEBig endian6C 34, 00 7A, D8 34 DD 1E UTF-16Little endian és BOM (Byte Order Marker) FF FE, 34 6C, 7A 00, 34 D8 1E DD UTF-16Big endian és BOMFE FF, 6C 34, 00 7A, D8 34 DD 1E Kódoljuk a Kínai víz jelét, a kis latin z-t, és a violin ‘G’ kulcsot, UTF-16 LE (Little Endian) és BE (Big Endian) változataival valamint BOM segítségével. Megjegyzés: BOM, FF FE = LE és FE FF = BE

11 Base64 kódolás 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 base64 kódolás 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--

12 Base 64 kódolás Base64 adat reprezentáció egy 64 jelből álló készleten alapul. A kódolást 6 bites csoportokon végezzük. 0..25 – ‘A’.. ‘Z’ 26..51 – ‘a’ – ‘z’ 52..61 – ‘0’ – ‘9’ 62 – ‘+’ 63 – ‘/’ Példa: kódoljuk a következő bináris adatot: ‘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 Mz

13 A kódolás 3 byte-onként történik, és az eredmény 4 karakter lesz. Hogyan kódolunk, ha a kódolandó bájtok száma nem osztható 3-al? Kódoljuk a ‘00000010’ ‘00000001’-t: 1. Egészítsük ki 3 byte-ra ‘00000010’ ‘00000001’ ‘00000000’ 2. Bontsuk fel 6 bitekre: 000000 100000 000100 000000 3. Az eredmény ‘AgE=’ Kódoljuk a 00000001-t: 1. Egészítsük ki 3 byte-ra ‘00000001’ ‘00000000’ ‘00000000’ 2. Kódoljuk az eredményt: 000000 01000000 000000 000000 3. Az eredmény ‘AQ==‘

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


Letölteni ppt "Karakter kódolások UCS, UTF, Base 64 Dr. Nehéz Károly egyetemi adjunktus Miskolci Egyetem Alkalmazott Informatikai Tanszék 2005 1."

Hasonló előadás


Google Hirdetések