Í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:

993-bit.gif

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:

[#table#][#tablefont size 32 color e0e0e0#]

  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 | | ~  

[#endtable#]

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:

[#table#][#tablefont size 32 color e0e0e0#]

  0 1 2 3 4 5 6 7 8 9 A B C D E F

8 Ç ü é â ä à å ç ê ë è ï î ì Ä Å

9 É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ [#u 20a7#] ƒ

A á í ó ú ñ Ñ ª º ¿ (reversednot) ¬ ½ ¼ ¡ « »

B (block25%) (block50%) (block75%) [#u 2502#] [#u2524#] [#u2561#] [#u 2562#] [#u 2556#] [#u 2555#] [#u 2563#] [#u 2551#] [#u 2557#] [#u 255d#] [#u 255c#] [#u 255b#] [#u 2510#]

C [#u 2514#] [#u 2534#] [#u 252c#] [#u 251c#] [#u 2500#] [#u 253c#] [#u 255e#] [#u 255f#] [#u 255a#] [#u 2554#] [#u 2569#] [#u 2566#] [#u 2560#] [#u 2550#] [#u 256c#] [#u 2567#]

D [#u 2568#] [#u 2564#] [#u 2565#] [#u 2559#] [#u 2558#] [#u 2552#] [#u 2553#] [#u 256b#] [#u 256a#] [#u 2518#] [#u 250c#] [#u 2588#] [#u 2584#] [#u 258c#] [#u 2590#] [#u 2580#]

E [#u 3b1#] [#u df#] [#u 393#] [#u 3c0#] [#u 3a3#] [#u 3c3#] [#u b5#] [#u 3c4#] [#u 3a6#] [#u 398#] [#u 3a9#] [#u 3b4#] [#u 221e#] [#u 3c6#] [#u 3b5#] [#u 2229#]

F [#u 2261#] [#u b1#] [#u 2265#] [#u 2264#] [#u 2320#] [#u 2321#] [#u f7#] [#u 2248#] [#u b0#] [#u 2219#] [#u b7#] [#u 221a#] [#u 207f#] [#u b2#] [#u 25a0#] [#u a0#]

[#endtable#]

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 [#gr g, l, x, y, h#] 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:

[#table#][#tablefont size 32 color e0e0e0#]

  0 1 2 3 4 5 6 7 8 9 A B C D E F

8 Ç ü é â ä à å ç ê ë è ï î ì Ä Å

9 É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ [#u 20a7#] ƒ

A á í ó ú ñ Ñ ª º ¿ “ ” ‹ › ¡ « »

B ã õ Ø ø œ Œ À Ã Õ § ‡ † ¶ © ® ™

C „ … ‰ • – — ° Á Â È Ê Ë Ì Í Î Ï

D Ò Ó Ô Š š Ù Ú Û Ÿ ß ő ű Ő Ű

[#endtable#]

(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:

[#table#][#tablefont size 32 color e0e0e0#]

  0 1 2 3 4 5 6 7 8 9 A B C D E F

8 Ç ü é â ä à å ç ê ë è Ő î Í Ä Á

9 É æ Æ ő ö Ó ű Ú Ű Ö Ü ¢ £ ¥ [#u 20a7#] ƒ

[#endtable#]

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 [#cy u~#] betűt és az ukrán [#cy ie, ji#] betűket, de az ukrán [#cy i’#] hiányzik;

– 855: cirill, tartalmazza az összes ukrán, belorusz, szerb és macedón betűt, viszont a betűk sorrendje nem [#cy abvgd#], hanem [#cy abcdef#];

– 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:

[#table#][#tablefont size 32 color e0e0e0#]

  0 1 2 3 4 5 6 7 8 9 A B C D E F

8 Ç ü é â ä ů ć ç ł ë Ő ő î Ź Ä Ć

9 É Ĺ ĺ ô ö Ľ ľ Ś ś Ö Ü Ť ť Ł [#u d7#] č

A á í ó ú Ą ą Ž ž Ę ę ¬ ź Č ş « »

B (block25%) (block50%) (block75%) [#u 2502#] [#u 2524#] Á Â Ě Ş [#u 2563#] [#u 2551#] [#u 2557#] [#u 255d#] Ż ż [#u 2510#]

C [#u 2514#] [#u 2534#] [#u 252c#] [#u 251c#] [#u 2500#] [#u 253c#] Ă ă [#u 255a#] [#u 2554#] [#u 2569#] [#u 2566#] [#u 2560#] [#u 2550#] [#u 256c#] [#u 2567#]

D đ Đ Ď Ë ď Ň Í Î ě [#u 2518#] [#u 250c#] [#u 2588#] [#u 2584#] Ţ Ů [#u 2580#]

E Ó [#u df#] Ô Ń ń ň Š š Ŕ Ú ŕ Ű ý Ý ţ [#u b4#]

F [#u ad#] [#u 2dd#] [#u 2db#] [#u 2c7#] [#u 2d8#] [#u a7#] [#u f7#] [#u b8#] [#u b0#] [#u a8#] [#u 2d9#] ű Ř ř [#u 25a0#] [#u a0#]

[#endtable#]

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.

[#gtstart#][#gtfont times#][#gtsize 240#][#gt S#][#gtfill 000000 300 120#][#gtend#]

A 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 jobb oldali rajzon egy betű körvonalai láthatók, technikai okokból kicsit szaggatottan. 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 talpakat 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 (e8