Tartalom

Írás és nyelvek a számítógépen

A számítógépek egyik fontos felhasználási területe a szövegek feldolgozása, de kisebb mennyiségű szövegre mindenféle területen szükség van, az olvasni még nem tudó kisgyerekeknek szánt játékokat kivéve. Az ember nem gondolná, mekkora probléma az, hogy egy program tudjon azokon a nyelveken, amiken szeretnénk. S mi már egy boldog korszakban élünk; tíz-tizenöt évvel ezelőtt sokkal nagyobb probléma volt.

A kódolt betű

A problémát az okozza, hogy a számítógép csak számokkal tud dolgozni, a betűket tehát át kell változtatni számokká. Ez a feladat két részből áll:
  – biztosítani kell, hogy a számítógép meg tudja különböztetni az előforduló betűket és egyéb jeleket, azaz tudja, melyik melyik;
  – és biztosítani kell, hogy a számítógép ki tudja rajzolni a betűket, vagyis ismerje az alakjukat.
  A betűk megrajzolásához a régi számítógépek bittérképet használtak. Ilyesfélét:
  


  8·8 képpontnyi területen rajzoljuk meg a betűt, kétféle színt használva. Ezzel a módszerrel a betű alakja könnyen tárolható: minden képpontnak egy bit, minden nyolcbites sornak egy byte felel meg. Ahol a bit értéke 0, ott sötét lesz a szín; ahol 1, ott világos. Egy betű alakját nyolc byte-on tudjuk tárolni.
  A módszert évtizedek óta alkalmazzák, az első képernyős számítógépek már ezzel dolgoztak. A mai PC-k is ismerik ezt a tárolási rendszert, csak nyolc sor helyett tizenhatot használnak, hogy szebb legyen a kép.
  De ha egy szöveget így akarnánk tárolni, az nagyon helypazarló lenne. Betűnként nyolc byte! Ennek a cikknek a szövege ezzel a tempóval néhány mondaton belül megtöltené egy régi, hetvenes-nyolcvanas évekbeli számítógép 16 kilobyte-nyi memóriáját, holott ha minden betű tárolására csak egy byte-ot használunk fel, akkor nyolcszor ennyi is elfér. És hely kell a programnak is, ami a szöveget feldolgozza.
  Ezért a számítástechnikusok már a kezdet kezdetétől így kódolták a szövegeket: egy betű = egy byte. Azazhogy nem betű, hanem karakter, a számítástechnika így nevezi őket: karakternek számít minden betű, írásjel, számjegy, grafikai jel, ékezetes betű, vezérlőkarakter (olyan kód, aminek kiíratásakor nem egy jel jelenik meg, hanem a számítógép vagy a nyomtató valami egyebet csinál, például új sort kezd, más betűtípusra kapcsol, megváltoztatja az írás színét, csönget vagy letörli a képernyőt).
  Minden számítógépnek volt egy jelkészlete: az általa ismert karakterek gyűjteménye. A nyolcvanas évek végéig a számítógépgyártók töméntelen típust fejlesztettek ki, amiknél nem volt cél, hogy szót értsenek egymással, így a jelkészletet is tetszés szerint lehetett kialakítani. Minden gép ismerte a következő jeleket:
  – az angol ábécé betűi (de volt gép, amelyik csak a nagybetűket ismerte);
  – a számjegyek;
  – a szóköz;
  – a következő írásjelek és matematikai jelek: . , : ; ? ! ( ) + - * / = < > % # $ & ' " (de volt gép, amelyikről hiányzott a felkiáltójel).
  A PC-k ezeket a jeleket is ismerték: [ ] { } \ | _ ` ^ ~. A három utolsót ékezet gyanánt helyezték el a billentyűzeten, hogy a nyugat-európai nyelvekben leggyakoribb ékezeteket (á, ä, à, â, ã) az aposztróf, az idézőjel és ez a három karakter jelölhesse. Ez még a teletype-ok korában alakult így ki, amikor a számítógép papírra (és csak oda) írt: kiírták a betűt, eggyel visszaléptették az írófejet, kiírták az ékezetet, és ott volt az ékezetes betű.

Az ASCII

A folyamat, amiről mesélek, a morzeábécé feltalálásáig vezethető vissza. A mai számítógépes kódtáblázat az ötvenes-hatvanas évek fordulóján kezdett kialakulni. A neve ASCII [eszki]: American Standard Code for Information Interchange, amerikai szabványos kód információk cseréjéhez.
  Az ASCII eredetileg hétbites: egy karaktert a byte első hét bitje kódolt, így a nullától 127-ig terjedő kódszámoknak volt jelentésük; a nyolcadik bitnek sokáig csak hibakezelési funkciója volt. Némi kísérletezés, igazgatás után a 128 kódszám jelentése a következőképpen alakult ki.
  Nullától 31-ig különféle vezérlőjelek vannak; jó néhányuk jelentése már a kezdet kezdetén feledésbe merült, másokat mindmáig használnak.
  A 32-es kódtól kezdve a táblázat így fest:

0 1 2 3 4 5 6 7 8 9 A B C D E F
2 ! " # $ % & ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~

A táblázatot hexadecimálisan kell olvasni: baloldalt olvasható a szám első jegye, felül a második. A bal felső sarokban tehát a 20h = 32-es kódú jel, a szóköz van. Az utolsó kód (7Fh = 127) egy ma már nem használt vezérlőjel.

A bővített ASCII

Változtak az idők, változtak a szükségletek. Amikor az ASCII megszületett, fontos volt az adatátvitelek hibaellenőrzése, annyira, hogy karakterenként egy külön bitet fönntartottak erre. Néhány évtizeddel később ez már nem volt olyan fontos, nagyobb szükség volt arra, hogy a gépek tudjanak másféle nyelveken is, nemcsak angolul. Ekkora már nem teletype-ot használtak, hanem képernyőt, így hiába volt a gépen a betű és ^ jel, ez nem könnyítette meg az â betű előállítását. A képernyőt egyforma négyzetekre (karakterhelyekre) osztották, és mindegyik négyzetben egyszerre csak egyféle karakter volt látható. Olyan karakter pedig, ami nem szerepel a gép jelkészletében, egyáltalán nem jelenhetett meg. A képernyőnek ezt az üzemmódját karakteres módnak hívjuk; némelyik számítógépen semmilyen más üzemmód nem állt rendelkezésre, ahol pedig igen, ott a többi nagyságrendekkel több memóriát igényelt és sokszorta lassúbb volt kezelni.
  Mindezek miatt elsősorban a jelkészletet bővítették, éspedig a nyolcadik bit segítségével: a 128 és 255 közötti kódszámokhoz is karaktereket rendeltek.
  Megszámlálhatatlanul sok jelkészlet jött létre. A számítógépek egy részén a jelkészletet megfelelő program segítségével át lehet rajzolni, és a nem angol anyanyelvű felhasználók általában megrajzolták nyelvük ékezetes betűit, vagy ami kellett: cirill, görög betűket, matematikai jeleket, mindenki a saját igényei és ízlése szerint. Voltak nyelvek, amelyekhez négy-ötféle kódkiosztás terjedt el – s bizonyára sok száz, amiket csak az ismert, aki kitalálta.
  Kódkiosztásnak azt a módot nevezzük, ahogyan a kódszámokat hozzárendeljük a karakterekhez. Ha két kódkiosztásban ugyanazok a karakterek vannak, akkor az egyikkel készült szöveget be lehet konvertálni a másikba: ha például az á betű kódja az egyik kiosztásban 160, a másikban 128, akkor a szöveg összes 160-as byte-ját ki kell cserélni 128-ra.
  A karakteres képernyőt használó PC-k 1981-től általában a 437-es kódtábla nevű kódkiosztást kapták. Ebben a 128-tól kezdődő kódok a következők voltak:

0 1 2 3 4 5 6 7 8 9 A B C D E F
8 Ç ü é â ä à å ç ê ë è ï î ì Ä Å
9 É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ƒ
A á í ó ú ñ Ñ ª º ¿ ¬ ½ ¼ ¡ « »
B
C
D
E α ß Γ π Σ σ µ τ Φ Θ Ω δ φ ε
F ± ÷ ° · ²  

Ez a jelkészlet ma is benne van a PC-kben, csak nem látszik, mert a Windows mással dolgozik, ezért eltakarja, de megfelelő program segítségével előcsalogatható. Az összeállítást rengeteg kritika érte, logikusan.
  „Ott ül az a szegény amerikai számítástechnikus az akár 256 betű és írásjel elhelyezésére is elegendő kódtáblázat előtt, és kétségbeesetten látja, hogy nem tudja mivel kitölteni. A szűkös angol abc miatt neki mindössze 26 betűje van, nagybetűkkel együtt ez 52, hozzá 10 számjegy meg néhány írásjel. De mindezeket játékosan felduzzasztva se tudja a 100-at elérni. Szerencsére szabadon kell hagyni 32 helyet a vezérlőkódoknak, így most már 122-nél tart. Innen kezdve azonban teljesen tanácstalan. […]
  Istenem, még mindig van 41 szabad kódszám! Várjunk csak! Hátha eljutnak a számítógépek déli szomszédunkhoz, Mexikóba, s nekik az n felett ott van a váltóáram jele: ñ. Meg a kanadai franciák, nehogy reklamálják azt az aranyos kis kalapot az ê betűn… Persze, amikor a múltkor Európában jártam, láttam én még ott néhány fura betűt a svédeknél, a dánoknál, Németországban… nem bánom, tegyük azokat is a kódtáblába.”
  Így írt Faklen Pál Magzarul besyelunk? című cikkében, az Alaplap 1990. júniusi számában. Sokan érezték úgy, hogy a 437-es jelkészletet hozzá nem értők állították össze, ami azért volt nagyon nagy baj, mert a cikk írásának idején használt számítógépek jelentős részén egyáltalán nem lehetett kicserélni a jelkészletet, legfeljebb az azt tároló áramkör kicserélésével (ha van hozzá szakember és van mire cserélni). Ezzel a jelkészlettel lehet írni franciául, de nincs œ betű, és az ékezetes nagybetűk túlnyomó része hiányzik. Lehet írni spanyolul, de nincs nagy Á, É, Í, Ó betű. Van å és æ betű, hogy írhassunk dánul és norvégül, de nincs ø betű, hogy tényleg írhassunk dánul és norvégül. Az æ betűt ezen a két nyelven kívül csak a latin használja, talán egyházi célokra tették bele? Van egy csomó görög betű, de ahhoz nem elég, hogy görögül írhassunk (nincs kis γ, λ, ξ, ψ, η stb.), matematikai képletekhez pedig ez nem elég. Van kétrészes integráljel (az F4-F5 kódokon), de nincs kétrészes zárójel, és rengeteg matematikai jelet lehetne még elképzelni. Mindenből van egy kicsi, de semmiből sincs elég.

A 437-es kódtábla persze nem volt elég a magyaroknak se, akik hiányolták saját betűiket. A kilencvenes években tömegével készültek olyan nyomtatványok (főleg számítástechnikai cégek reklámjai, árlistái), amiken öt hűtőházból kértünk színhúst helyett öt hûtôházból kértünk színhúst (nagybetűkkel: ÖT HÿTºHÅZBòL KÉRTÜNK SZìNHùST) módra voltak az ékezetek. Akik ennél igényesebben akartak dolgozni, azok kicserélték a jelkészletet a nyomtatójukban. Jómagam akkoriban úgy dolgoztam, hogy a képernyőmön mindenféle grafikus jeleket láttam az ékezetes betűk helyett, meg kellett tanulni, hogy melyik betű helyett milyen jelnek kell lennie. Az SZKI (Számítástechnikai Kutató Intézet) kódkiosztását használtuk, ami a Ventura 2.0 kiadványszerkesztőben volt:

0 1 2 3 4 5 6 7 8 9 A B C D E F
8 Ç ü é â ä à å ç ê ë è ï î ì Ä Å
9 É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ƒ
A á í ó ú ñ Ñ ª º ¿ ¡ « »
B ã õ Ø ø œ Œ À Ã Õ § © ®
C ° Á Â È Ê Ë Ì Í Î Ï
D Ò Ó Ô Š š Ù Ú Û Ÿ ß ő ű Ő Ű

(A készlet hátralevő része teljesen üres volt.) Ezzel a jelkészlettel már leírható volt Nyugat-Európa összes államnyelve, valamint a magyar nyelv. Ezzel párhuzamosan használták a CWI (Computerworld Informatika) jelkészletét, ami kevésbé különbözik a 437-estől, beéri a hiányzó magyar ékezetes betűkkel, amiket ritkábban használt nyugati betűk helyére tesz. Csak azt a két sort közlöm, ahol változás van a 437-eshez képest:

0 1 2 3 4 5 6 7 8 9 A B C D E F
8 Ç ü é â ä à å ç ê ë è Ő î Í Ä Á
9 É æ Æ ő ö Ó ű Ú Ű Ö Ü ¢ £ ¥ ƒ

A nyugat-európai nyelvekhez ez idő tájt a Microsoft készített kódtáblákat, rejtélyes okokból úgy, hogy egy-egy nyelv vagy nyelvcsoport számára külön kódtáblát dolgozott ki. Ilyeneket:
  – 860: portugál (ã, õ);
  – 861: izlandi (ð, þ, ý);
  – 863: kanadai francia (a québeci franciák pontosan ugyanazokat az ékezetes betűket használják, mint a franciaországiak, az elnevezésnek csak politikai oka lehet);
  – 865: „nordikus”, az ø betűt tartalmazza a dán és a norvég számára.
  Ebből a négyből áll össze a 850-es többnyelvű latin, amely furcsa módon ı (ponttalan i) betűt is tartalmaz, noha ezt csak a török használja, amelynek többi ékezetes betűje viszont nincs meg.
  Később jött még két kódlap:
  – 857: török, a 850-es kibővítése a törökhöz szükséges İ, ğ, ş betűkkel, így ezzel már a rendszerváltás előtt politikailag Nyugat-Európához tartozó nyelvek mindegyikén lehet írni, a görög kivételével;
  – 858: ugyanaz, mint a 850-es, de az ott hasznavehetetlen ı helyére € jelet tettek.
  A nem latin betűs nyelvek támogatására készültek a következők:
  – 866: cirill, az orosz ábécén kívül tartalmazza a belorusz ў betűt és az ukrán є, ї betűket, de az ukrán і hiányzik;
  – 855: cirill, tartalmazza az összes ukrán, belorusz, szerb és macedón betűt, viszont a betűk sorrendje nem абвгд, hanem абцдеф;
  – 737 és 869: görög.
  Készültek kódlapok a kínai, a japán és a koreai írás számára is, de hamar kiszorultak.

Közép-Európát a Microsoft egyetlen kódlappal, a 852-essel kívánta támogatni, amely így nézett ki:

0 1 2 3 4 5 6 7 8 9 A B C D E F
8 Ç ü é â ä ů ć ç ł ë Ő ő î Ź Ä Ć
9 É Ĺ ĺ ô ö Ľ ľ Ś ś Ö Ü Ť ť Ł × č
A á í ó ú Ą ą Ž ž Ę ę ¬ ź Č ş « »
B Á Â Ě Ş Ż ż
C Ă ă
D đ Đ Ď Ë ď Ň Í Î ě Ţ Ů
E Ó ß Ô Ń ń ň Š š Ŕ Ú ŕ Ű ý Ý ţ ´
F ­ ˝ ˛ ˇ ˘ § ÷ ¸ ° ¨ ˙ ű Ř ř  

A támogatott nyelvek a következők:
  – albán: ç, ë;
  – cseh: á, č, ď, é, ě, í, ň, ó, ř, š, ť, ú, ů, ý, ž;
  – horvát és szlovén: ć, č, đ, š, ž;
  – lengyel: ą, ć, ę, ł, ń, ó, ś, ź, ż;
  – magyar: á, é, í, ó, ö, ő, ú, ü, ű;
  – német: ä, ö, ß, ü;
  – román: ă, â, î, ş, ţ;
  – szlovák: á, ä, č, ď, é, í, ĺ, ľ, ň, ó, ô, ŕ, š, ť, ú, ý, ž.
  Lett is felzúdulás. Százan száz szólamban kiabálták ugyanazt. Hogy nem kompatibilis egyetlen meglevő kódtáblával sem (magyarhoz volt ugye a CWI meg az SZKI, lengyelhez a Cyfromat, a DHN meg a Mazowia, csehhez-szlovákhoz a Kamenický, és így tovább). Hogy összevissza vannak benne dobálva a betűk, minden rendszer nélkül. Hogy egy kalap alá vettek olyan nyelveket, amiknek nem sok közük van egymáshoz, és így lehetetlen például magyar szövegben leírni Molière nevét, amire sokkal gyakrabban van szükség, mint České Budějovicére. A Microsoftot persze mindez nem érdekelte, új kelet-európai kódlap nem készült.

A TrueType

Időközben megjelent a Windows és a többi grafikus rendszer, ahol a bittérképes megjelenítés már nem volt elég. Olyan megoldásokra volt szükség, amik minőségvesztés nélkül lehetővé teszik a karakterek nagyítását és egyéb átalakításait. Többféle megoldást vezettek be; a Windows a TrueType rendszert használja. Már nem jelkészletet mondunk, hanem fontot, és egyszerre értjük rajta a jelek összességét és a képüket tároló file-t.
  993-s.jpgA TrueType fontok Bézier-görbéket használnak a karakterek alakjának leírására. Ez egy matematikai eljárás, ami tetszőleges alakú görbék rajzolását teszi lehetővé. A rajzon egy betű körvonalai láthatók. Ez a betű négy görbével előállítható: kettő közülük S alakú és a körvonal két szélét alkotja, kettő pedig egyenes vonal és a végeket zárja le.
  A grafikus felület igazi előnye az, hogy nem vagyunk többé a karakteres mód korlátaihoz kötve. Most már azt is meg lehet tenni, hogy a szöveg egy részét az egyik fonttal írjuk ki, más részét egy másikkal, annyi fontot cserélgetünk, amennyit akarunk. Nincs többé akadálya kelet-európai és nyugat-európai, cirill és görög keverésének. Bajba csak akkor kerülünk, ha olyan jelkészletekre van szükségünk, amik önmagukban sem férnek el a 256 kódon, például kínaira vagy matematikai jelekre.

A Unicode

Már a nyolcvanas években felismerték, hogy a bővített ASCII nyolc bitje nem elég ahhoz, hogy a világ nyelveihez szükséges rengeteg jelet, a matematika, a technika, a zene sok-sok jelét mind felölelje – de ha sikerülne minden jelet egyetlen kódtáblában elhelyezni, az nagyszerű lenne. Akkor minden jelnek egyetlen egységes kódja lenne, nem lennének többé kódtáblák és konverziók, és mindent egységesen lehetne kezelni.
  Ha a karakterek kódjait nyolc helyett tizenhat biten, vagyis két byte-on tárolnánk, akkor 256 helyett 65 536 kódot használhatnánk. Ez már elégnek tűnik. 1986-ban a Xeroxnál egy munkacsoport összegyűjtötte az egyforma kínai és japán írásjegyeket. A következő év decemberében Joe Becker kitalálta a Unicode nevet. A kilencvenes évek folyamán a szabvány folyamatosan fejlődött, de csak az ezredforduló táján kezdett elméletből gyakorlattá válni. 1998-ban jelent meg a Windows első olyan változata, amelyik támogatta a Unicode-ot, de ez a támogatás még csak két dologra szorítkozott. Egyfelől a Windows beépített fontjai tartalmaztak bizonyos mennyiségű unicode-os karaktert, másfelől – ami fontosabb – a rendszer elboldogult a tizenhat bites karakterkódokkal. Innentől U+0000-tól U+FFFF-ig minden karaktert meg lehetett rajzolni és el lehetett helyezni szövegekben. (A unicode-os karaktereket szabványosan U+ előtaggal jelölik, ami után a hexadecimális kódszám áll. FFFF a legnagyobb hexadecimális szám, ami két byte-on tárolható.)
  A Unicode-ban a jeleket tartományokba csoportosítják, amik különböző méretűek, és nevük van; a nevek dőlt betűkkel állnak a továbbiakban.
  A Windows 98 beépített fontjai csak a Unicode egy kicsiny részletét fedték le, de ez is ízelítőt ad az új szabvány lehetőségeiből:
  – a nyugat-európai ékezetes betűk (âèïøþ);
  – Latin Extended-A néven további 128 ékezetes betű (āċęģĭřů);
  – a Latin Extended-B tartomány néhány fontosabbnak ítélt karaktere (ơǎǽ);
  – az újgörög ábécé (αθξϋώ);
  – a cirill ábécé orosz, ukrán, belorusz, szerb és macedón nyelvhez szükséges betűi (гчђќ);
  – a héber ábécé (אלףש);
  – az arab ábécé legfontosabb jelei (ؤثشك٤);
  – a Latin Extended Additional tartomány egy része, elsősorban a vietnami ékezetes betűk (ạẩệứỹ);
  – a General Punctuation-beli központozási jelek egy része (–‘„†‰);
  – a matematikai jelek egy kicsiny hányada (∂∑∞≠);
  – a dobozgrafikus jelek egy része, amik a 437-es kódtáblában is benne vannak (┤═╘╫).
  A Unicode azonban csakhamar a két byte-ot is kinőtte. Nem csoda: a különböző betűírások egyenként legfeljebb százegynéhány jelet számlálnak, de vagy egy tucat van belőlük; a szótagírások már több száz darabig elmennek; a különböző matematikai-technikai jelek általában 256 darabos tartományokat kaptak; s mindez a mennyiség eltörpül a CJK (Chinese, Japanese, Korean, vagyis kínai, japán és koreai) mellett, amelynek legnagyobb egybefüggő tartománya huszonegyezer karaktert tartalmaz.
  A szakemberek összeállítottak olyan CJK-tartományt is, ami több mint negyvenezer jelet számlál, nem beszélve a sok-sok kisebb-nagyobb karaktercsoportról, amik együttvéve még sok ezret kitesznek. Ennyi jel egyszerűen nem fér el még 65 536 kódon sem. Egy lehetséges megoldás lenne, hogy három, esetleg négy byte-on kódoljuk a karaktereket, de a fejlesztők nem akarták tovább növelni az olyan szövegek méretét, amik csak „köznapi” karaktereket tartalmaznak. Ezért különböző UTF-eket (Unicode Transformation Format, Unicode-átalakítási formátum) dolgoztak ki.
  Az UTF-8 formátumban egy byte kódolja az olyan karaktereket, amik beleférnek a hétbites ASCII-be (U+0000–U+007F), két byte az U+0080–U+07FF közöttieket, három byte pedig U+0800-tól U+FFFF-ig mindent. A maradékot négy byte kódolja. Ezt használják leggyakrabban, de van UTF-16 és több másféle rendszer is.
  A következőkben az olvasó megnézheti, hol tart számítógépe a Unicode támogatásában. A mintaszövegeket kétféleképpen is megmutatom: képként, ami minden böngészőben megjelenik, és Unicode-kódszámokkal, aminek megjelenése a számítógép képességeitől függ.

Unicode-mintaszövegek

Latin-1 Supplement: ©åçøþ
  Latin Extended-A: ąĝīńů
  Latin Extended-B: ƆƏƥƹǡ
  IPA: ɐɕɲʃʕ
  Görög: αβγδε
  Cirill: абвгд
  Örmény: աբգդե
  Héber: אבגדה
  Arab: ابةتث
  Hindi: तथदधन
  Tamil: கஙசஜஞ
  Thai: กขฃคฅ
  Letterlike Symbols: ℂℇ℗℣Å
  Nyilak: ←↙↥↱↻
  Matematikai jelek: ∇∋∓∡∰
  Enclosed Alphanumerics: ①⒂⒣Ⓠⓦ
  Miscellaneous Symbols: ☁★☏☥☮
  Hiragana: ぁかにとる
  Katakana: アカニトル
  Bopomofo: ㄅㄆㄇㄈㄉ
  Kínai: 中文字曲語
  Koreai: 모때며흉다

»»»»»»