2024. április 19., péntek

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Unicode, a varázslatos

  • (f)
  • (p)
Írta: |

''Gimli fáradtan leült egy fatönkre az út szélén, és próbálta megérteni amit a sebesült...

[ ÚJ TESZT ]

''Gimli fáradtan leült egy fatönkre az út szélén, és próbálta megérteni amit a sebesült ork, vérben fetrengve hörgött.
- #&#@$§$# - mondta az ork elhalóan.
- Látod, ez a baj veletek, csak a gyűlölet sugárzik minden szavatokból - sziszegte Gimli, miközben Gandalf a botjára támaszkodva figyelte őket. Homloka ráncaiból kiviláglott, hogy valami nagyon jelentőségteljes dolgon törheti a fejét.
- Tudod Gimli - mondta Legolas - azért kár, hogy soha nem értettük meg igazán a nyelvüket.
- @#§§@&#@ - hallatszott a háttérből erőtlenül.
A törpe felhorkant. - Szavak! A szavakkal nem megyünk semmire! Talán még jobb is, hogy nem értjük őket... - mire hirtelen Gimli torkára fagyott a szó, mikor a varázsló botjából vakító fény kezdett sugározni.
- Unicodis characteris! - kiáltotta Gandalf megvilágosultan.
- ... csak pókerezni... - hörögte az ork utolsó szavaival és kimúlt.
A társaság döbbenten meredt a halottra.
- Mit jelentsen ez? - nézett döbbenten Frodó.

- Gyorsan az Egy Gyűrűt - sürgette a mágus a félszerzetet.
A kis társaság zavartan meredt a Gandalf által magasra emelt gyűrűre, melyen érthető szavakká kezdtek átformálódni az eddig ismeretlen rúnák.
'205 cm magas, idős de fiatalos sötét nagyúr, hatalmas birtokkal keresi párját. Jelige...' ''

Részlet Ding Dorong, 'Óda a Bábelhalhoz avagy mitől döglik a légy' című művéből

[kép]

Kezdetek

Mi az az Unicode és miért van rá szükség? Hogy ezt megértsük, kezdjük az elején.
A számítógépek elterjedésével szükségesé vált egy szabványos karakterkészlet kidolgozása, hiszen sok problémát jelent, ha az egyik számítógépen az 'a' betű mondjuk az 1-es, a másikon pedig a 21-es kódot jelenti. Ezért 1963-ban megjelent az ún ASCII szabvány. Az ASCII - ellentétben azzal, ahogy sokan tévesen hiszik - mindössze 128 charactert tartalmaz, többek között az angol ABC írásjeleit, az arab számjegyeket, néhány írás-, valamint vezérlő jelet. Persze hamar kiderült, hogy 128 karakter messze nem elég, ezért a szabványt kibővítették, és megszületett az Extended ASCII kódkészlet, mely már 256 karakterből áll. Ez az alap karakterkészletet néhány fejlett ország nyelveiben megtalálható ékezetes írásjelekkel, valamint néhány grafikus karakterrel egészítette ki. Viszont ennyi karakter sem volt elég, ezért az Extended ASCII-nak több variánsa is megjelent.

[kép]
Részlet az ASCII kódkészletből

És Isten látá, hogy a kódlap jó, de nem eléggé...

Megszülettek a kódlapok (codepage), melyeket jól ismerhetünk még a DOS-os korszakból. Ahhoz, hogy pl. magyar ékezetes írásjeleket használhassunk régi, MS-DOS-os gépen, a 852-es codepage-t kellett beállítani (ezt általában a gép indítása után az autoexec.bat, egy automatikusan futó script elvégezte).
Ez viszont újabb problémákat szült, hiszen ugyanaz a kód az egyik kódlapon jelenthette pl. a magyar 'ű'-t, de a másikon valami teljesen más karaktert. Ezért még mindig problémás volt a nemzeti nyelven írt dokumentumok elolvasása különböző kódlapra beállított gépeken, arról nem is beszélve, hogy nem mindig volt egyértelmű, hogy melyik kódlapról volt szó valójában. De még nagyobb problémát okozott, hogy bizonyos ábécék nem fértek bele a 128 extra karakterbe.

[kép]
Egy Unicode fontkészlet közelebbről megvizsgálva...

Unicode, a varázslatos

A fent említett problémákra megoldás végül 1991-ben született az Unicode 1.0 szabvány megszületésével. Mi is ez valójában? Sok tévhittel ellentétben az Unicode nem egy karakter- avagy fontkészlet, hanem szabvány. A szabvány pontosan leírja, hogy melyik kódtól kezdődhet az egyes nemzetek ábécéje, írásjele a fontkészletekben. Pl. a magyar kis 'ő' a 245-ös kódú karakter. Ugyanakkor a 937-en a nagy görög omega jelet találjuk. További tévhit, hogy ''csak'' 65536 karakert tartalmazhat. Nos, a jelenlegi unicode szabvány (5.0) szerint összesen 1.114.112 kód (karakter) tárolható, melyből jelenleg 9,2% van lefoglalva a nemzeti ábécéknek. Még fontos megjegyezni, hogy az első 128 karakter, a standard ASCII karakterkészletet tartalmazza.

[kép]
Kódolási formák és a kódolt karakterek hossza. A táblázatból kiolvashatjuk, hogy egy bizonyos kódsávba eső karakter hány bájt hosszú lesz kódolva a különböző kódolási formákon belül.

Szabvány és kódolási forma

Sokan ugyancsak összekeverik a szabványt a karakterek kódolási formájával. Az Unicode maga a szabvány, a tárolás forma meg a kódolás (encoding). Ez azért fontos, mivel a pusztán kódolás nélküli unicode karakterek mindegyike 2 bájtból és 5 bitből állna (h0-h10FFFF-ig), ami az esetek többségében elképesztő memóriapazarlás lenne. Ezért megszülettek a kódolási technikák.
A legelterjedtebb ezek közül az UTF-8 és az UTF-16. A beépített Windows XP Notepad mindkét formátumot képes kezelni, de megtévesztően csak Unicode néven hivatkozik az UTF-16-ra. Számunkra a legtakarékosabb - latin fontkészletet feltételezve - az UTF-8, mivel az ékezet nélküli magyar írásjeleket (vagyis a latin ábécét) 1 bájton tárolja, ezért célszerű ezt használni. Az utóbbi kódolási formát gyakorlatilag felfoghatjuk egy egyszerűbb, tömörítő algoritmusnak is.

UTF-8 vs UTF-16

De mégis melyik a jobb? Nézzük meg a két kódolási forma előnyeit és hátrányait.

UTF-8
+ A latin írásjelek, arab számok és az egyéb írásjelek mind vagy 1 vagy 2 bájton tárolódnak (magyar nyelv esetében csak az ékezetes írásjelek 2 bájtosak)
+ Fix kódolási forma, minden operációs rendszeren (nem változik a bájtok sorrendje)
+ Latin ábécék kódolásánál helytakarékos
+ az első 128 kód változtatás nélkül megegyezik az ASCII kódkészlettel, ezért a standard ASCII szöveget az algoritmus be tudja olvasni
- Bonyolultabb kódoló és dekódoló rutin

UTF-16
+ Egyszerű kódolás és dekódolás, minden karakter vagy 2 vagy 4 bájton tárolódik, latin ábécék esetében 2 bájton.
- Helypazarló, amennyiben latin ábécét kódolunk
- Különböző operációs rendszereknél eltérhet a bájtsorrend (byte order) a szónál (word) és a dupla szónál (double word), ezért BOM prefixet (Byte Order Mark) célszerű használni, de sajnos nem kötelező
- BOM nélkül csak találgatni lehet a bájtsorrend kitalálásánál (little-endian, big-endian), ezért teljesen hibásan is dekódolhatjuk a karaktereket
- Nem tudja olvasni a standard ASCII szöveget

[kép]

Gyakorlatban

Alapvetően számunkra az érdekes, hogy egy bizonyos operációs rendszer, szoftver, esetleg szoftverfejlesztő környezet támogatja e az Unicode karaktereket. Amennyiben nem, jobban tesszük, ha tartózkodunk az ékezetes karakterek használatától, hiszen nem biztos, hogy ugyanaz a szöveg fog látszani egy másik számítógépen, amit mi látunk otthon, hiszen a program szinte bizonyosan 1 bájton tárolja a karaktereket, hasonlóan a DOS-os kódlapokhoz. Ellenkező esetben - az Unicode támogatás meglétével - nyugodtan használhatunk ékezetes karaktereket bárhol, bár a fájl és könyvtár nevekben így sem célszerű.

Ez a cikk alapvetően olyan embereknek készült, akik nincsenek tisztában az Unicode fogalmával, ezért nem kívánok mélyebbre ásni. Akit mélyebben érdekel a téma, ajánlom a lent található linkeket, de a kérdésekre is szívesen válaszolok.

Linkek
[link] ASCII
[link] Extended ASCII
[link] ASCII + Extended ASCII táblázat
[link] [link] Unicode
[link] UTF-8
[link] UTF-16
[link] Endiannes (Big Endian)

A cikkben előforduló hibákért előre is elnézést kérek, az építő jellegű kritikát szívesen fogadom. A cikk elején elkövetett idézetért a felelősséget nem vállalom, Ding Dorongot, a szerzőt kell megkövezni. :-)

Update
[link] Ezen a linken megnézhetjük az eddigi, összesen 98.884 db, Unicode 5.0 szabványban kódolt grafikus karaktert.

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.