Bevezetés az Informatikába Karakterek bináris ábrázolása Készítette: Perjési András andris@aries.ektf.hu
Alap probléma A számítógép egy bináris rendszerben működő gép Mindent numerikus formátumban ábrázolunk Az emberek számára kényelmetlen az információ ilyen módú értelmezése (az itt ülőkre természetesen ez nem vonatkozik, 0x75 0x67 0x79 0x65*? ) *: értsd 7 bites ASCII karakterábrázolás szerint
Egy ideális világban... A számokat decimálisan ábrázoljuk és decimális számrendszerben értelmezzük A szövegeink betűkből épülnek fel(nem pedig bináris értékekből) Nemzetenként az ábécék sajátos betűket(jeleket...) tartalmazhatnak
Egy digitális világban... A számokat binárisan Fixpontosan, lebegőpontosan(ieee 754) Karaktereket binárisan BCD 6 bit EBCDIC 8 bit ASCII 7 bit UTF-8 8-16-24-32 bit UTF-16 16-32 bit
Decimális számok ábrázolása BCD-vel Binary Coded Decimal IBM szóhasználatában, 6 bites alfanumerikus kódok (64 darab) decimális számjegyek, nagybetűk, speciális jelek) számjegyek esetén felső két bit 00...bennünket valójában ezek érdekelnek...\o/
Decimális számjegyek BCD-n Több kódolási forma is létezik, ezek közül kettő: Natural Binary Coded Decimal (bitsúly: 8-4-2-1) Aiken (bitsúly: 2-4-2-1) Decimális Számjegy Bináris NBCD kód Bináris Aiken kód 0 0000 0000 1 0001 0001 2 0010 0010 3 0011 0011 4 0100 0100 5 0101 1011 6 0110 1100 7 0111 1101 8 1000 1110 9 1001 1111
BCD ábrázolása Byte-orientáltak vagyunk Kézzel mindig hexadecimálisan írjuk fel Két módszer létezik Zónás(pakolatlan) ábrázolás Pakolt ábrázolás
Zónás ábrázolás Alsó 4 biten mindig a számjegy Felső 4 biten implementáció függő EBCDIC implementáció esetén 1111 vagyis F ASCII implementáció esetén 0011 vagyis 3 Decimális szám: 127 Ábrázolva EBCDIC-vel F1 F2 F7 Ábrázolva ASCII-vel 31 32 37
Pakolt ábrázolás 1 decimális számjegy 4 biten......1 byte-on tároljunk 2 decimális számjegyet... Decimális szám: 127 Ábrázolva pakoltan 01 27...páratlan számjegy esetén a felső nibble-re 0-t írunk
Előjeles BCD-k Előjelek ábrázolásának több módja is van, két közkedvelt BCD kód (természetesen hexadecimálisan) C - pozitív(+) D - negatív(-) Ábrázolva EBCDIC-vel Pakolt F1 F2 C7 12 7C
Hatékonyság 16 biten tárolható szám esetén tisztán binárisban 1111 1111 1111 1111 (2) = NBCD ábrázolásban 65635 (10) 1001 1001 1001 1001 (2) = 9999 (10)
Pro/Contra BCD Pro belső ábrázolás-szöveg(képernyőnnyomtatón) konverzió hatékonyabb egyszerűbb hardware-es szükséges kerekítés, valós rész tárolás Contra tárolás nem túl hatékony(16 biten 0,16%) több aritmetikai művelet megvalósítása bonyolultabb mint tiszta binárison
Összeadás NBCD-ben Összeadás számjegyenként Ha a számjegyek összege 9-nél nagyobb, az eredményhez adnunk kell 6-ot(binárisan: 0110), hogy a következő helyiérték a következő nibble-re essen Amennyiben van további összeadandó helyiérték akkor természetesen az előbbi áthozatot ehhez hozzáadjuk.
Összeadás NBCD-n(Példa) Végezzük el az NBCD-n a következő műveletet: 127+182 Decimális 1 2 7 NBCD 0001 0010 0111 Decimális 1 8 2 NBCD 0001 1000 0010
Összeadás NBCD-n(1.lépés) 0001 0010 0111 + 0001 1000 0010????
Összeadás NBCD-n(2.lépés) 0001 0010 0111 + 0001 1000 0010???? 0111 + 0010 1001
Összeadás NBCD-n(3.lépés) 0001 0010 0111 + 0001 1000 0010???? 0111 + 0010 1001 kisebb mint 9
Összeadás NBCD-n(4.lépés) 0001 0010 0111 + 0001 1000 0010???? 0111 + 0010 1001 Nem nagyobb 9-nél
Összeadás NBCD-n(5.lépés) 0001 0010 0111 + 0001 1000 0010???? 1001
Összeadás NBCD-n(6.lépés) 0001 0010 0111 + 0001 1000 0010???? 1001 0010 + 1000 1010
Összeadás NBCD-n(7.lépés) 0001 0010 0111 + 0001 1000 0010???? 1001 0010 + 1000 1010 nagyobb mint 9
Összeadás NBCD-n(8.lépés) 0001 0010 0111 + 0001 1000 0010???? 1001 0110 1010???? 0010 + 1000 1010 nagyobb mint 9
Összeadás NBCD-n(9.lépés) 0001 0010 0111 + 0001 1000 0010???? 1001 0110 0001 1010 0001 0000 0010 + 1000 1010 nagyobb mint 9
Összeadás NBCD-n(10.lépés) 0001 0010 0111 + 0001 1000 0010???? 0000 1001 0110 0001 1010 0001 0000 0001 + 0001????
Összeadás NBCD-n(11.lépés) 0001 0010 0111 + 0001 1000 0010???? 0000 1001 0110 0001 1010 0001 0000 0001 0001 + 0001????
Összeadás NBCD-n(12.lépés) 0001 0010 0111 + 0001 1000 0010???? 0000 1001 0110 0001 1010 0001 0000 0001 0001 + 0001 0011
Összeadás NBCD-n(13.lépés) 0001 0010 0111 + 0001 1000 0010???? 0000 1001 0110 0001 1010 0001 0000 0001 0001 + 0001 0011 kisebb mint 9
Összeadás NBCD-n(14.lépés) 0001 0010 0111 + 0001 1000 0010???? 0000 1001 0110 0001 1010 0001 0000 0001 0001 + 0001 0011 kisebb mint 9
Összeadás NBCD-n (eredmény) 0001 0010 0111 + 0001 1000 0010 0011 0000 1001 NBCD 3 0 9 Decimális Decimálisan kiszámolva az eredményt láthatjuk hogy az előbbi algoritmus helyes: 127+182=309
Karakterek kódolása A binárisan tárolt numerikus értékekhez karaktert rendelünk Kölcsönös és egyértelmű hozzárendelés, minden karakterhez megállapodás alapján adott kód tartozik. (belső ábrázolás/kód) Fontos szempont: a hordozhatóság (helyi nyelvi jellegzetességek)
Kódolási rendszerek American Standard Code for Information Interchange ASCII Extended ASCII Extended Binary Coded Decimal Interchange Code - EBCDIC Unicode Transformation Format UTF-8, UTF-16
ASCII kódrendszer Amerikai Szabványügyi Hivatal fejleszti korai távírók kódrendszere alapján 1956, Ivan Idelson indítványa a Brit Szabványügyi Hivatalhoz Első alkalmazás: 1963, AT&T TWX távíró rendszerében
ASCII kódrendszer tulajdonságai 7 bites kód A legtöbb rendszer ekkor már byte alapú Sokáig a 8. bit paritás illetve vezérlő bit Latin ábécén alapul és tartalmazza az angol nyelv kis/nagy betűit
ASCII kódtábla csoportjai I. 7 bites kódtábla felépítése helyiérték Decimális bit érték 6. 5. KarakterCsoport 0 0 0-31 Vezérlő karakterek 0 1 32-63 Számjegyek és elválasztó jelek 1 0 64-95 Nagybetűk és különleges jelek 1 1 96-127 Kis betűk és különleges jelek
Extended ASCII A nyelvi jellegzetességek követésére: 8. bit alkalmazása karakterek tárolásához ISO implementálás ISO 8859-1 Latin 1 Western European ISO 8859-2 Latin 2 Eastern European ISO 8859-5 Cyrillic Microsoft implementáció CP-1252
Extended ASCI jellemzői Egy karakter - 1 byte Első 128 karakter szabványos, állandó A második 128 karakter mindig az adott kódtábla által specifikált A helyes értelmezéshez tudnunk kell, hogy a szöveg milyen kódtábla szerint került tárolásra
ASCII jelentősége A fejlesztésben az IBM részt vett, innen a mai PC-k IBM kompatibilitása(kisgépes környezetekben ez terjedt el) Karakterábrázolásban, hálózati kommunikációban(ftp ASCI adatátvitel)
EBCDIC kódrendszer Extended Binary Coded Decimal Interchange Code Kizárólagos IBM fejlesztés(még az ASCII előtt) Először 1963-1964 között IBM System/360 mainframe-en
Történeti vonatkozás Nagygépes környezet 12 soros lyukkártyákon alkalmazzák Zóna rész: első 3 sor Szám rész: további 9 sor
EBCDIC jellemzői 8 bites kódrendszer Nem kompatibilis az ASCII-vel A kódtábla egy standard részre és egy kódlap specifikált részre osztható Hatékonyságra nézve nincs jelentős különbség az ASCII és az EBCDIC között
EBCDIC Latin-1 kódtábla, (vezérlő karakterek nélkül)
EBCDIC Alkalmazása Napjainkban is IBM nagy gépes környezetekben Szövegfájloknál Adatbázisoknál Unicode karakterkészlet megjelenítéshez UTF-EBCDIC (nem terjedt el)
Univerzális kódtábla igénye Az számítógépek elterjedésével egyre több ország, egyre több karakterét kellett megjeleníteni Nem feltétlenül fért el egy nyelv ábécéje a második 128 karakteren A kódtáblák között lehetetlen megteremteni az átjárhatóságot
Unicode szabvány Ipari szabvány mely a különböző nyelvek írott szövegeinek átviteléhez, feldolgozásához, megjelenítéséhez ad módszert. (jelek sorrendje, írásmódja) Jelenleg: Unicode 7.0 2014 Október 08.
Unicode Konzorcium A szabvány fejlesztői támogatói Bárki részese lehet a tagsággal járó díj kifizetése mellett Kalifornia-i székhely Jól ismert konzorciumi tagok:
Unicode karakterek ábrázolása 1 114 112 karakter(kódpont) - Unicode 7.0 Unicode karakterek ábrázolása(kódolás) : UTF-8 8 bites, egy karakter 1-4 byte UTF-16-16 bites, egy karakter 2-4 byte
UTF-8 kódolás Ábrázolás 8 bites kódegységekkel Visszafelé kompatibilitás ASCII Latin-1 Változó hosszúságú kódolás Karakterek belső kódja(kódpontja) UTF-8 kódolással 1-2-3-4 byte-on ábrázolható
Változó hosszúságú kódolás Elméleti ábrázolás legfeljebb 21 biten (Unicode 7.0 szabvány szerint) Az esetek többségében nem férünk el egy byte-on (szám szerint 1 113 856 esetben )
Konverziós táblázat Belső kód 1. byte prefixumok További byteokszáma abc defg 0abc defg 0 abc dexx xxxx 110a bcde 1 abcd xxxx xxxx xxxx 1110 abcd 2 a bcxx xxxx xxxx xxxx xxxx 1111 0abc 3 ab xxxx xxxx xxxx xxxx xxxx xxxx 1111 10ab 4 axx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 110a 5 További byte-ok prefixuma: 10xx xxxx
Konverziós tábla használata I. A Belső kód oszlop használata: A bitkekre illesszük a Unicode karakter bináris kódját (ha szükséges egészítsük ki balról 0-kkal) UTF-8 kód oszlopok használata: Félkövér bitek: szabad bit -ek a Belső kód oszlop bitjeit kell ide írni folytonosan Normál szedésű bitek: rögzített prefixum bitek, a meghatározott bitértékeket tárolja
Változó hosszúságú kód előállítása I. Unicode karakter: Belső kód: U+03D7 Belső kód binárisan: 0000 0011 1101 0111
Illesztés 1. sorra 0000 0011 1101 0111 Belső kód 1. byte prefixumok További byteokszáma abc defg 0abc defg 0 abc dexx xxxx 110a bcde 1 abcd xxxx xxxx xxxx 1110 abcd 2 a bcxx xxxx xxxx xxxx xxxx 1111 0abc 3 ab xxxx xxxx xxxx xxxx xxxx xxxx 1111 10ab 4 axx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 110a 5 További byte-ok prefixuma: 10xx xxxx
Utolsó 7 bit illeszkedik... 0000 0011 1101 0111 Belső kód 1. byte prefixumok További byteokszáma abc defg 0abc defg 0 abc dexx xxxx 110a bcde 1 abcd xxxx xxxx xxxx 1110 abcd 2 a bcxx xxxx xxxx xxxx xxxx 1111 0abc 3 ab xxxx xxxx xxxx xxxx xxxx xxxx 1111 10ab 4 axx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 110a 5 További byte-ok prefixuma: 10xx xxxx
...felső 9 bit viszont eltér 0000 0011 1101 0111 Belső kód 1. byte prefixumok További byteokszáma abc defg 0abc defg 0 abc dexx xxxx 110a bcde 1 abcd xxxx xxxx xxxx 1110 abcd 2 a bcxx xxxx xxxx xxxx xxxx 1111 0abc 3 ab xxxx xxxx xxxx xxxx xxxx xxxx 1111 10ab 4 axx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 110a 5 További byte-ok prefixuma: 10xx xxxx
Illesztés 2. sorra 0000 0011 1101 0111 Belső kód 1. byte prefixumok További byteokszáma abc defg 0abc defg 0 abc dexx xxxx 110a bcde 1 abcd xxxx xxxx xxxx 1110 abcd 2 a bcxx xxxx xxxx xxxx xxxx 1111 0abc 3 ab xxxx xxxx xxxx xxxx xxxx xxxx 1111 10ab 4 axx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 110a 5 További byte-ok prefixuma: 10xx xxxx
Bit illeszkedés 0000 0011 1101 0111 Belső kód 1. byte prefixumok További byteokszáma abc defg 0abc defg 0 abc dexx xxxx 110a bcde 1 abcd xxxx xxxx xxxx 1110 abcd 2 a bcxx xxxx xxxx xxxx xxxx 1111 0abc 3 ab xxxx xxxx xxxx xxxx xxxx xxxx 1111 10ab 4 axx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 1111 110a 5 További byte-ok prefixuma: 10xx xxxx
UTF-8-as kód képzése (első byte) Tárolandó belső kód bitjei (előző oldalon sötét zölddel jelölve) 011 1101 0111 UTF-8-as kód első byte-ja mivel második sorban vagyunk... Bitminta Konkrét első byte 110a bcde 1100 1111
UTF-8-as kód képzése (további byte-ok) Tárolandó belső kód bitjei 011 1101 0111 UTF-8 további bájtok sortól függetlenül... Bitminta Konkrét első byte 10xx xxxx 1001 0111
Változó hosszúságú kód előállítása I. Unicode karakter: Belső kód: U+03D7 Belső kód binárisan: 0000 0011 1101 0111 Belső kód UTF-8-as ábrázolással: 1100 1111 1001 0111 CF 97
UTF-16 kódolás Ábrázolás 16 bites kódegységekkel 1 x 16 bit 0x0000-0xFFFF kódpontig(bmp) 2 x 16 bit - 0x10000-0x10FFFF kódpontig Változó hosszúságú kódolás Karakterek belsőkódja 2-4 byte-on ábrázolható(~1 vagy 2 darab 16 bites egységen) Kódpont több(>=2) bájton...milyen sorrendben értelmezzük a szó byte-jait?
Byte-order ~ Endianess Lilliput-i architektúra vagy Brobdingnag-i architektúra A kérdés pontosabban: Milyen sorrendben tároljuk az adategységeket(avagy felső vagy alsó helyiérték egységekkel kezdjük?)
A nagy végű világ Big Endian szabály: nagy vég az elején legnagyobb byte(most Significant Byte) kerül a legalacsonyabb címre egységen belül a felső helyiértékű byte-okat tároljuk először Hexadecimális számérték: Big Endian tárolás 2 byte-os egységekel: 0A0B0C0D 0A0B 0C0D
A kis végű világ Little Endian szabály: kis vég az elején legkisebb byte(least Significant Byte) kerül a legalacsonyabb címre egységen belül az alsó helyiértékű byte-okat tároljuk először Hexadecimális számérték: Little Endian tárolás 2 byte-os egységekel: 0A0B0C0D 0B0A 0D0C
UTF-16 és endianitás Endianitás jelzése miatt 3 szabvány UTF-16 Byte Order Mark kezdő karaker FE FF (big endian), FF FE (little endian) UTF-16BE(Big Endian) ~ nagy vég az elején UTF-16LE(Little Endian) ~ kicsi vég az elején A következő példák mind UTF-16BE kódolást használnak
UTF-16, 2 byte-os ábrázolás Ha a Unicode kódpont nem nagyobb mint 0xFFFF(65535) akkor az ábrázolás 1 darab 16 bites szóval történik A karakter - hexadecimális - Unicode azonosítója: U+2658. Mivel ez nem nagyobb mint 0xFFFF, így UTF-16-ban is 26 58 vagy 0010 0110 0101 1000 formában reprezentáljuk
UTF-16, 4 byte-os ábrázolás 0xFFFF(65535) értéknél nagyobb Unicode kódpontok 2 darab 16 bites szón Ezek ábrázolásához úgynevezett helyettesítő-párt használunk a négy byte-ot 0xD800-0xDFFF tartomány kettéosztásával tároljuk 1. szó a 0xD800-0xDBFF értéktartományon 2. szó a 0xDC00-0xDFFF értéktartományon
UTF-16 kód előállítás helyettesítő párral (Példa) A CJK(Chinese, Japan, Korean) karakter kódja: U+21341. Ábrázoljuk UTF-16BE kódolással.
UTF-16-os kód előállítás helyettesítő kódpárral I. A kódpont értékből kivonunk 10000 -ot (16) és az eredményt felírjuk binárisan: 21341 (16) -10000 (16) =11341 (16) = 0001 0001 0011 0100 0001 (2)
UTF-16-os kód előállítás helyettesítő kódpárral II. Az eredményt két 10 bites egységre bontjuk 0001 0001 0011 0100 0001 (2) 0001 0001 00 11 0100 0001
UTF-16-os kód előállítás helyettesítő kódpárral III. OR művelet az első 10 bites egység és az első szó helyettesítő kódpártartományának alsóértéke(0xd800) között 0001 0001 00 OR 0xD800 0000 0000 0100 0100 OR 1101 1000 0000 0000 1101 1000 0100 0100
UTF-16-os kód előállítás helyettesítő kódpárral IV. OR művelet az második 10 bites egység és az második szó helyettesítő kódpártartományának alsóértéke(0xdc00) között 0001 0001 00 OR 0xDC00 0000 0011 0100 0001 OR 1101 1100 0000 0000 1101 1111 0100 0001
UTF-16-os kód előállítás helyettesítő kódpárral V. Az utóbbi OR műveletek eredményeként kapott 2 darab 16 bites szót rendre egymás után írva megkapjuk a U+21341 kódpont UTF-16BE-ben ábrázolt kódját: 1101 1000 0100 0100 1101 1111 0100 0001 = D8 44 DF 41
Sok karakter - kevés font készlet probléma Egy adott font nem feltétlenül támogatja az összes Unicode karakter megjelenítését, Mikor ez történik akkor -t szúr be a megfelelő karakter helyére A fontoknak követni kell a Unicode szabvány fejlődését
A Unicode Jóó, ha tudjuk használni Unicode kódpontok adatbázisa pdf formátumban http://www.unicode.org/charts/index.html egyszerűen kereshető formában http://decodeunicode.org/ Unicode karakterek, megjelenítésre alkalmas fontok keresése http://www.fileformat.info/index.htm
Legyünk hát univerzálisak, mert másképp félreérthetőek leszünk... Köszönöm a -t!