38 Silmaring: Tekstikodeeringud

Erinevad tähestikud

Vahel tuleb ette, et tekstis paistab mingi täht kummalisena – võib-olla on see asendatud teise tähe, arusaamatu märgi, küsimärgi või hoopis mitme märgiga. Eestikeelses tekstis on sellisteks asendatud tähtedeks tavaliselt õ, ä, ö, ü ja ka š, ž. Need on tähed, mis ladina põhitähestikus puuduvad. Selliseid teistele võõraid tähti leidub paljudes ladina tähestikul põhinevates tähestikes. Näiteks on poola tähestikus ą, ć, ę, ł, ń, ó, ś, ź, ż, saksa keeles aga kasutatakse tähti ä, ö, ü ja ß. Selliste tähtedega on eriti arvutitega seoses mõnevõrra rohkem muresid kui ladina tähestiku põhitähtedega. Mõnedel juhtudel ongi neist loobutud – näiteks kriipsukesed, kaarekesed ja konksukesed jäetakse ära või täht asendatakse mingite sümbolite kombinatsiooniga. Tegelikult kannavad need omapärased tähed lisaks keelelisele tähendusele ka teatud ajaloo ja identiteediga seotud väärtust ja nendest ei tohiks kergekäeliselt loobuda.

Lisaks ladina tähestikul põhinevatele tähestikele on kasutusel palju teisi süsteeme, millel on omakorda alamsüsteeme. Näiteks vene, ukraina ja valgevene tähestikud on sarnased, aga mitte viimse täheni samad. Mõnede keelte puhul kasutatakse paralleelselt erinevaid tähestikke. Nii on näiteks serbia keele puhul kasutusel nii ladina tähestikul kui ka kirillitsal põhinevad variandid.

Arvestades, et mitmetes keeltes on kasutusel hieroglüüfid, mida võib olla väga palju (eriti võrreldes  Euroopas levinud paarikümne tähega tähestikes), on tegemist tuhandete erinevate märkidega, mida maailmas tekstide kirjapanekuks kasutatakse.

7 või 8 bitti. ASCII

Natuke lihtsustatult võib öelda, et arvutis kujutatakse tähti (ja teisi märke) kahendarvudena – ühtede ja nullide jadadena. Selleks, et konkreetne täht paistaks ka mujal sellisena nagu algselt mõeldud, on tarvis järgida mingisugust standardit.

1963. aastal avaldati ASCII (American Standard Code for Information Interchange) standardi esimene versioon. Standardiseerimispüüdeid oli ennegi ja lokaalselt need ka toimisid, kuid ASCII mõju oli laiem ja see on olnud mitmete edasiste standardite aluseks.

ASCII põhitabelis on 128 märki. Konkreetse märgi tähistamiseks kasutatakse kahendarvu, milles on seitse kahendnumbrit (e bitti). Erinevaid võimalusi on sellisel juhul 128 (= 27) ja nii ongi ASCII põhitabelis 128 märki. Põhitabelis on erimärkide ja numbrite kõrval ladina tähestiku need tähed, mida kasutatakse inglise keeles. Esindatud on nii suurtähed kui väiketähed, seejuures suurtähed A-Z (koodid kümnendsüsteemis 65 kuni 90, kahendsüsteemis 1000001 kuni 1011010) on väikestest a-z (koodid kümnendsüsteemis 97 kuni 122, kahendsüsteemis 1100001 kuni 1111010) eespool. Põhitabelis olevate märkidega saab ingliskeelseid tekste juba kenasti kirja panna.

Kui nüüd tahta kasutada teisi tähti, siis need enam süsteemi ei mahu. Loomulik oli võtta mängu kaheksas bitt, mis annab 128 märki juurde. Nii tehtigi, aga võimalikke kandidaate järgmisele 128 kohale oli rohkem, kui sinna ära mahtus. Oli ju vajadus erinevate ladina tähestikul baseeruvate tähestike spetsiaalsete tähtede jaoks, samuti kreeka tähtede jaoks, kirillitsa tähtede jaoks jm.

Siin toimus hargnemine selles mõttes, et kasutusele võeti erinevad koodisüsteemid, kus sama koodiga võivad eri süsteemides olla erinevad märgid. Järgnevas tabelis on mõned märgid erinevatest kooditabelitest:

Kodeering Kood 177 Kood 195 Kood 212 Kood 213
Windows-1252 (CP1252) ± Ã Ô Õ
ISO/IEC 8859-5 (mitteformaalselt Latin/Cyrillic) Б У д е
ISO/IEC 8859-7 (mitteformaalselt Latin/Greek) ± Γ Τ Υ

Sellise lähenemise üks puudus on see, et ühes ja samas tekstis ei saa hästi kasutada erinevate kooditabelite märke.

Mitu baiti. Unicode. UTF-8

Edasi püüti luua standardit, kus kõik vajalikud märgid on erinevate koodidega olemas. Tänapäeval on selleks Unicode, mis on rahvusvaheline standard arvutite tekstide kodeerimiseks. Unicode’i tabelid on olemas väga erinevate sümbolite jaoks. Kuna kahendsüsteemi arvud lähevad kiiresti pikaks, siis on tabelites kasutatud vastavaid kuueteistkümnendsüsteemi arve.

Lisaks standardi olemasolule on vajalik seda võimalikult säästlikult rakendada, sest üleliigne mälukasutus muutub ruttu väga kulukaks. 1993. aasta alguses tutvustati ametlikult kodeeringut UTF-8, millega on võimalik kõiki Unicode-i sümboleid esitada. UTF-8 on alates 2008. aastast veebis levinuim koodeering (praegu on hinnanguliselt umbes 87% veebilehtedest selles kodeeringus). UTF-8 on lühend fraasist Universal Coded Character Set + Transformation Format – 8-bit. UTF-8 kasutab kaheksabitilisi koodiühikuid, mida konkreetse märgi jaoks võib olla kasutuses 1 kuni 4. Kaheksa bitti annab kokku ühe baidi ja baitide kaupa on arvuti mälus mõistlik “arveldada”.

UTF-8 esimesed 128 märki (ja koodidki) on samad, mis ASCII põhitabelis. UTF-8 kasutab neil juhtudel ühte kaheksabitilist koodiühikut. Kõik ASCII kodeeringus tekstid on seega kohe ka UTF-8 kodeeringus.

Järgmise 1920 märgi puhul kasutatakse kahte kaheksabitilist koodiühikut. Siin on erinevate ladina tähestikul põhinevate tähestike erilisemad tähed, samuti kreeka, kirillitsa, heebrea, araabia, kopti ja armeenia tähed.

Kolme kaheksabitilist koodiühikut kasutatakse näiteks hiina, korea ja jaapani kirjamärkide puhul.

Nelja koodiühikut on vaja ülejäänud Unicode’i tabelis olevate märkide jaoks, mille hulgas on näiteks matemaatilised sümbolid ja piktogrammid.

Kodeeringud Pythonis

Ka Pythonis saab kasutada erinevaid tekstikodeeringuid. Nii saame näiteks faili avamisel tekstikodeeringu määrata: open(failiNimi, "w", encoding="UTF-8").

Nüüd püüame Unicode’i tabelites olevaid huvitavaid märke ekraanile saada. Vastav ingliskeelne materjal on selles abiks olnud. Proovime saada ekraanile kreeka suure delta (kood 0394) ja jaava tähe, mille kood on A996:

print('\u0394\uA996')

 

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Programmeerimine on loodud Eno Tõnisson, Tauno Palts, Merilin Säde, Kaarel Tõnisson jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut