Unicode

**Unicode** on rahvusvaheline standard arvutites kirjasüsteemide kodeerimiseks, mida haldab Unicode’i konsortsium. See hõlmab suuremaid kirjasüsteeme. 2023. aasta septembris ilmus standardist versioon 15.1.0, mis defineerib 149 813 unikaalset märki.

Unicode'is viiakse iga märk vastavusse ühe unikaalse arvuga ehk antakse igale märgile oma "koodipunkt" (ingl *code point*). Standardis märgitakse seda kujul "U+xxxx", kus xxxx on arv heksadetsimaalsüsteemis. Koodipunkt hoiustab endas infot märgi identiteedi, mitte aga selle välimuse kohta. Tarkvara saab kasutada seda infot, et näiteks vastava märgi mingi versioon ekraanile kuvada.

Koodipunkti kodeerimiseks arvutis on mitu standardset viisi.
Unicode'i standard defineerib kolm kodeerimise viisi, UTF-8, UTF-16 ja UTF-32, mis lubavad infot märgi kohta edastada vastavalt 8, 16 ja 32 bitiste ühikutena. Neist levinuim on UTF-8, mis on ASCII-ga tagasiühilduv.

Tänapäeval on Unicode kõige laiemalt levinud kirjasüsteemide kodeerimise viis ning tarkvara arendamisel on sellega vastavus eeldatud. Standardiga paralleelne on standard ISO 10646, mida hoitakse vastavuses Unicode'iga. 

## Loomine ja arendus

### Algusaastad
Globaliseerumise ja tehnoloogia arengu tõttu tuli 20. sajandi lõpuks ilmsiks, et senised kirjasüsteemide kodeerimise standardid on liiga piiravad. Lääne firmadel oli keeruline siseneda Aasia turule, kus 7-bitisest ASCII koodist jäi tähestiku kodeerimiseks väheseks. Samuti oli järjest rohkem ühendatud ühiskonnas probleemne asjaolu, et kodeerimise süsteemid ei olnud riistvaras standardiseeritud. Oli vajadus uue suurema võimekusega standardi järele. 

Unicode'i idee ei olnud midagi täiesti uut. Juba 1984. aastal esitatud ISO mitmebaidise märgikoodi standardi alus oli seatud 16-bitise universaalse koodi loomist silmas pidades. Teiseks Unicode'i eelkäijaks võiks nimetada Xeroxi 1980. aastal tutvustatud Star-tööjaama.

Unicode'i projekti vundament laoti 1980. aastatel, mil toimusid esmased arutelud kolme tarkvarainseneri – toona Xeroxis töötanud Joe Beckeri ja Lee Collinsi ning Apple'is töötanud Mark Davise – vahel. Vajadus universaalse kirjasüsteemide kodeerimise viisi järele oli ilmsiks tulnud Apple File Exchange'i arenduse valguses. 1988. aastal hakati ideed ellu viima. Augustis avaldas Joe Becker oma ettepaneku universaalse kodeerimise süsteemi jaoks "Unicode 88", kasutades esimest korda nime "Unicode", mis tema sõnul pidi peegeldama selle universaalset ja unikaalset olemust. Sügisel hakkas Collins looma Unicode'i märkide andmebaasi.

Järgnenud aastate jooksul töörühm laienes ja töö standardi kallal jätkus. 1990. aasta augustis anti välja esimene mustand, mis ei hõlmanud koodide ja blokkide kirjeldusi, tegemist oli pigem kirjeldava ja tutvustava dokumendiga. Oktoobris välja antud mustand oli juba palju sisutihedam, kirjeldades mitmeid algseid ideid märkide indekseerimiseks ja hõlmates erinevaid tabeleid nende süsteemseks hoiustamiseks. 1990. aasta detsembris avaldatud kolmas väljaanne oli juba laialdaselt jagatud. Eesmärk oli saada avalikkuse tagasisidet. 1991. aasta oktoobris avaldati esimene Unicode'i standardit kirjeldav raamat, selle teine köide 1992. aasta juunis.

### Unicode'i konsortsium
Unicode'i konsortsium loodi 1991. aasta jaanuaris USA California osariigis. See on mittetulundusühing, mille eesmärk on arendada, hooldada ja propageerida rahvusvahelisi tarkvara standardeid, nende hulgas ka Unicode'i. Konsortsium teeb koostööd teiste rahvusvaheliste standardiseerimisega tegelevate organisatsioonidega nagu ISO ja W3C. 

Konsortsiumi saavad kuuluda nii ettevõtted kui ka üksikisikud ning kuuluvusel on mitu tasandit. Suuremad hääleõiguslikud liikmed on näiteks Apple, Airbnb, Google, Meta ja Microsoft. Samuti on konsortsiumis n-ö nõuandvaid liikmeid, näiteks kuulub nende hulka Soome rahvusraamatukogu, samuti erinevad ülikoolid ja riiklikud asutused. Kõik konsortsiumi liikmed on loetletud Unicode'i veebilehel.

### Unicode'i olemus
Unicode põhineb ideel kodeerida '''grafeeme''', mitte aga nende graafilisi kujusid ehk glüüfe, mida suudavad paremini hallata erinevad kirjastiilid, kasutades näiteks märgistuskeelt. See tähendab, et keerulisematel juhtudel, nagu seda on Hiinas kasutatava Han-tähestiku erinevate ortograafiliste variantide käsitlus, leidub mitmeid lahkarvamusi selle kohta, millised variandid on piisavalt erinevad, et seda oleks vaja teistest variantidest eraldiseisvana käsitleda ja kodeerida.

Kõige abstraktsemal tasemel **määrab Unicode'i iga tähemärgi jaoks unikaalse numbri**, mida nimetatakse koodipunktiks. Paljude visuaalse esindusega seotud küsimustega - sealhulgas suuruse, kuju ja stiili - peaksid eeldatavalt tegelema teksti kuvav tarkvara, nagu veebibrauser või tekstiredaktor.

Esimesed 256 koodipunkti peegeldavad ISO/IEC 8859-1 standardit, eesmärgiga lihtsustada juba lääne-euroopa tähestikes kirjutatud tekstide kodeerimist. Et oleks võimalik vanemate kodeeringute ja Unicode'i vahel teisendamine ilma kadudeta, anti paljudele tähemärkidele, mis on peaaegu identsed teistega nii välimuse kui ka eeldatava funktsiooni osas, erinevad koodipunktid. Näiteks dubleerib Unicode'i plokk Halfwidth and Fullwidth Forms täielikult ladina tähestikku, kuna vanad Jaapani, Hiina ja Korea kodeeringud sisaldasid nii "täislaiusega" (vastavalt eelmainitud tähestike tähemärkide laiusele) kui ka "poollaiusega" (vastavalt tavalisele ladina tähestikule) tähemärke. See tähendab, et ühteagu leiduvad erinevad versioonid samast tähemärgist, mis hõivab terve tähemärgi laiuse Jaapani, Korea ja Hiina tähemärkide järgi, kui ka ladina tähestiku järgi.

### Tähestikud ja kirjad

Unicode'i standardiga kodeeritakse tähestikke, mitte keeli. Kui mitu keelt kasutavad sama tähestikku, moodustavadki nad ühe kirja. Ladina kirja kasutavad näiteks sajad erinevad keeled, Hanguli kasutab aga tüüpiliselt ainult korea keel.

Unicode'i versioonis 1.1, mis tuli välja 1993. aastal, oli 23 erinevat kirja, aastal 2022 välja tulnud versioon 15.0 aga hõlmas juba 161 erinevat kirja. Lisaks tähtedele on Unicode'iga võimalik kodeerida ka numbreid, kirjavahemärke, matemaatilisi sümboleid, emotikone ja palju muud. See aga jätab veel suure osa sümboleid ja märke kõrvale ning aktiivselt tegeletakse nende lisamisega. 

Unicode'i Roadman to the BMP komitee (Michael Everson, Rick McGowan, Ken Whistler, V.S. Umamaheswaran) haldab nimekirja nendest kirjadest ja nende võimalikest koodiplokkidest, mis potentsiaalselt lisatakse tulevikus standardile.

### Versioonid
Erinevalt paljudest teistest kodeerimise süsteemidest ei ole Unicode staatiline. Iga uus versioon lisab juba olemasolevatele grafeemidele uusi juurde, seejuures jättes juba eksisteerivad koodipunktid puutumata. Juba avaldatud versioonid on samuti täiesti stabiilsed. Sedasi on võimalik tagada, et tarkvara, mis on ehitatud kindla versiooni peale, töötab alati.

Versioone nummerdatakse kolme arvuga, neist igaüht peab saama esitada ühe baidiga. Esimene number näitab versiooni, teine selle kõrvalversiooni ning kolmas kõrvalversiooni uuendust. Näiteks "Unicode 15.1.0" viitab Unicode'i 15. versiooni uuendamata 1. kõrvalversioonile.

#### ''Errata'' ja ''Corrigenda''
*Errata* ja *Corrigenda* ehk veaparandused ja korrigeerimised on aeg-ajalt vajaliku, neid avaldatakse Unicode'i veebilehel. Veaparandused parandavad vigu tekstides või muudes informatiivsetes materjalides, nagu koodikaardid. Iga kord, kui standardi uus põhi- või kõrvalversioon avaldatakse, koondatakse kõik senised veaparandused selle versiooniga seotud põhispetsifikatsiooni, koodikaartide või muude standardikomponentide hulka. 

Mõnikord võivad vead olla aga piisavalt olulised, et need tuleb likvideerida enne järgmise Unicode'i standardi versiooni väljaandmist korrigeerimisega. Selline korrigeerimine ei muuda eelmise versiooni sisu, vaid võimaldab rakendusel, protokollil või muul standardil viidata eelmisele Unicode'i standardi versioonile koos korrigeerimisega. Kui viide ei maini spetsiaalselt korrigeerimist, siis korrigeerimist ei rakendata.

## Arhitektuur

### Koodiruum ja koodipunktid
Unicode'i standard määratleb koodiruumi: täisarvude jada intervallis (0 ; 17*2^{16}), mida nimetatakse koodipunktideks. Vastavalt standardile märgitakse seda vahemikku U+0000–U+10FFFF. Koodiruum on Unicode'i standardi süstemaatiline, arhitektuurist sõltumatu esitus; teksti töödeldakse binaarandmetena kahutades ühte mitmest Unicode'i kodeeringust.

Selles esitusviisis eelneb kahekohaline eesliide U+ alati kirjutatud koodipunktile ja koodipunktid ise kirjutatakse kuueteistkümnendsüsteemi numbritena. Alati kirjutatakse vähemalt neli kuueteistkümnendsüsteemi numbrit, vajadusel lisatakse ette nullid.

Koodiruumis on kokku 1112064 kehtivat koodipunkti. See arv tuleneb UTF-16 kodeeringu piirangutest, mis võimaldab kodeerida 2^{16} koodipunkti vahemikus U+0000 kuni U+FFFF, välja arvatud 2^{11} koodipunkti vahemikus U+D800 kuni U+DFFF, mis kasutatakse asenduspaaridena 2^{20} koodipunkti kodeerimiseks vahemikus U+10000 kuni U+10FFFF.

### Kooditasandid
Unicode'i koodiruum on jagatud 17 tasandiks, mis on nummerdatud vahemikus 0–16. Tasandit 0 nimetatakse otsetõlkena tavaliseks mitmekeelseks tasandiks (ingl *Basic Multilingual Plane* ehk BMP) ning sellel on kõik laialdasemalt kasutatud märgid. Kõik märgid sellel tasandil on vaadeldavad kui üks koodiühik UTF-16 kodeeringus ja kodeeritavad ühe, kahe või kolme baidiga UTF-8 kodeeringus.

Tasand 1 on täiendav mitmekeelne tasand (ingl *Supplementary Multilingual Plane* ehk SMP), millel on need märgid ja sümbolid, mis kas ei mahtunud tasandile 0 või mida kasutatakse väga harva. Nende sekka kuuluvad mitmed ajaloolised kirjad, piktogrammid ja muud abstraktsemad sümbolid. Tasandid 2 ja 3 hoiustavad neid Hiina, Jaapani ja Korea (CJK) tähestike märke, mis ei mahtunud CJK märkide jaoks spetsiaalselt eraldatud plokkidesse tasandil 0.

Tasand 14 ehk täiendav erikasutusega tasand (ingl *Supplementary Special-purpose Plane*) sisaldab neid küljenduse kontrollimiseks kasutavaid märke, mis samuti ei mahtunud tasandil 0 vastavasse plokki. Tasandid 15 ja 16 on privaatseks kasutuseks. Kokku on versioonis 15.0 privaatseks kasutuseks 137 468 märki, neist 6400 on tasandil 0 ja ülejäänud tasanditel 15 ja 16.

### Koodiplokid
Unicode ei määra rangelt ära piirkondi oma andmestruktuurides, küll aga on kasulik vaadelda tasandit 0 plokkide kaupa. Üldiselt on ühes plokis olevad märgid omavahel seotud, sarnase kasutuspiirkonnaga või mõnel muul viisil ühendatud. Need plokid ei piira seda, millised märgid lõpuks kuhu satuvad, aga hõlbustavad siiski koodipunktide märkamist. Koodiplokid pole ka kuidagi eksklusiivsed, näiteks matemaatikasümboleid leidub valuutatähiste plokis, ladina tähestiku märke leidub aga vähemalt 14 koodiplokis.

### Üksik- ja liitmärgid

Et laiendada võimalike märkide arvu, kasutab Unicode liitmärkide loomise mehhanismi. Sisuliselt tähendab see seda, et täpid, katused jne lisatakse märgile tagant järele. Samas on enamustest laialdaselt kasutusel olevatest märkidest olemas ka valmis versioonid, et muuta teisendamine vanemate kodeerimissüsteemidega lihtsamaks.

Selle näide on korea tähestiku Hanguli kodeerimine: Unicode võimaldab koostada hanguli silpe nende üksikutest Hangul Jamo alamkomponentidest, samas on kodeeritud ka 11 172 eelkoostatud silpide kombinatsiooni.

### Kodeerimine
Kuni aastani 1996, kui tuli välja Unicode 2.0, oli tegemist 16-bitise süsteemiga, siis aga laiendati koodiruum vahemikuni U+0000 kuni u+10FFFF, mis nõuaks kasutada 21-bitist kodeerimist. Selle asemel on võimalik Unicode'i märke esitada mitme arvu jadana, vastavalt kodeerimise viisile kuni nelja 8-bitise, kahe 16-bitise või ühe 32-bitise koodiühikuna.

#### UTF-8
Enim levinud Unicode'i kodeerimise viis on UTF-8. Nagu nimi viitab, koosnevad UTF-8 kodeeringus märgid 8-bitistest koodiühikutest. UTF-8 on ASCII-ga tagasiühilduv.

UTF-8 kodeerimise esimene bait kannab infot selle kohta, mitmest baidist märk koosneb. Ühest baidist koosnevad märgid on kujul 0xxxxxxx, ehk võimalik on näidata täpselt 7 bitti, mis on ASCII märkide pikkus. Kui ühest baidist ei piisa, annab kodeerimine sellest märku kujul 110xxxxx – siin näitab esimese 1 ja 0 vahel olevate ühtede arv, mitu baiti on märgis lisaks sellele, mida parasjagu loetakse. Iga järgmine bait on kujul 10xxxxxx kus 10 viitab, et tegu on jätkubaidiga.

Näide:

# Euro märgi € kuju Unicode's on U+20AC, mis on kahendsüsteemis 0010 0000 1010 1100.
# Selle kodeerimiseks läheb vaja kolme baiti.
# Esimene bait on kujul 1110xxxx. 1-e ja 0-i vahel on kaks 1-e, seega koosneb märk 1+2=3 baidist.
# Saame kahendkoodis € kujuks: 11100010; 10000010; 10101100 ← alla on joonitud märgi pikkusele viitav ja jätkubaite signaalivad osad baitides.

## Viited

## Välislingid
* The Unicode Consortium
* TITUS Unicode Sample Page Alphabets of Baltic Languages - UTF-8

__SISUKORDEES__