Unicode

Unicode on tietokonejärjestelmiä varten kehitetty merkistöstandardi ja käytännössä sama kuin yleismaailmallisen merkistön (engl. Universal Character Set, UCS) määrittävä kansainvälinen standardi ISO/IEC 10646. Unicode määrittää yksilöivän koodiarvon yli 100 000 kirjoitusmerkille. 
Maailmassa puhutaan tuhansia kieliä, jotka käyttävät kymmeniä erilaisia kirjoitusjärjestelmiä, ja kunkin kielen kirjoittamiseen tarvitaan sille ominainen merkkivalikoima. Useimmissa vanhemmissa tietokonemerkistöissä, kuten 7-bittisessä ASCIIssa ja 8-bittisessä ISO Latin 1:ssä, on tilaa enintään 128:lle tai 256:lle erilaiselle merkille, joten yhteen merkistöön eivät mahdu edes kaikkien Euroopan unionin virallisten kielten kirjoitusmerkit, puhumattakaan esimerkiksi kiinalaisista ja japanilaisista merkeistä. Unicode sen sijaan on 21-bittinen, mikä mahdollistaa yli miljoona merkkipaikkaa. Siinä on yllin kyllin tilaa kaikille maailman kielten käyttämille merkeille sekä erinäisille teknisille kontrolli- ja erityiskoodeille.
Unicode-merkkeihin voidaan viitata yksitarkoitteisilla merkkikoodeilla eli tunnuksilla. Tunnus kirjoitetaan tyypillisesti muodossa U+xxxx, jossa etuliite U+ viittaa Unicode-standardiin ja xxxx on numeroista 0–9 sekä kirjaimin esitettävistä numeroista A–F koostuva heksadesimaaliluku. Esimerkiksi suuraakkosen Y tunnus on U+0059, ja suuraakkosen Z tunnus on U+005A. Tunnuksen koodiarvo voidaan esittää myös tavallisena desimaalilukuna (esimerkiksi heksadesimaaliluku 59 vastaa desimaalilukua 89, ja 5A puolestaan vastaa desimaalilukua 90), mutta yleensä suositaan heksadesimaalista muotoilua. Heksadesimaalinen Unicode-tunnus esitetään vähintään nelinumeroisena, mutta tarvittaessa se voi koostua viidestä tai jopa kuudesta numerosta.

Historia

Ajatus yleismaailmallisesta ja mahdollisimman kattavasta merkistöstä alkoi itää 1980-luvulla useallakin taholla. Vuonna 1984 kansainväliset standardointijärjestöt ISO ja IEC perustivat yhdessä työryhmän valmistelemaan tällaista merkistöä, joka sai nimekseen ISO/IEC 10646. Ohjelmistoteollisuuden edustajat puolestaan perustivat samaan perustavoitteeseen pyrkivän intressiryhmän The Unicode Consortium vuonna 1990. 
Muodollisesti Unicode ja ISO/IEC 10646 ovat erillisiä standardeja, mutta käytännössä ne on yhdenmukaistettu keskenään ja niitä kehitetään yhteistyönä. Unicode on saanut enemmän näkyvyyttä kuin ISO-standardi osin ilmeisesti siksi, että sanamainen nimi Unicode on helpommin muistettavissa ja käytettävissä kuin koodimainen numerosarja. Asiaan saattaa vaikuttaa myös se, että virallinen standardointityö mielletään jähmeäksi mutta teollisuuden edustaja Unicode dynaamiseksi. 
Alun perin Unicode suunniteltiin 16-bittiseksi, mikä mahdollisti 65 536 merkkipaikan koodiavaruuden. Kun huomattiin, että se ei riitäkään kaikkien maailman nykyisten ja historiallisten kirjoitusjärjestelmien tarpeisiin, Unicoden versioon 2.0 rakennettiin mekanismi, joka laajensi standardin 21-bittiseksi ja näin mahdollisti yli miljoonan merkkipaikan koodiavaruuden. Valtaosa näistä merkkipaikoista on yhä tyhjiä. Unicoden versio 3.0 määritti yksilöivän koodiarvon 49 194 merkille, ja vuonna 2009 julkaistu versio 5.2 jo 107 361 merkille.

Unicoden rakenne

Unicoden merkkiavaruus jakautuu 17 tasoon (engl. plane). Jokainen taso koostuu 65 536 merkkipaikasta, joten kaikkiaan mahdollisia merkkipaikkoja on 1 114 112. Ensimmäinen taso tai oikeammin nollataso on monikielinen perustaso (engl. Basic Multilingual Plane, BMP), joka koostuu nelinumeroisella heksadesimaaliluvulla esitettävistä merkkipaikoista (U+0000...U+FFFF) ja sisältää lähes kaikki nykyään käytössä olevien kirjoitusjärjestelmien merkit. Ylemmistä tasoista käytössä on toistaiseksi vain pieni osa. Tasolle 1 (U+10000...U+1FFFF) on sijoitettu lähinnä historiallisten kirjoitusjärjestelmien merkkejä, ja taso 2 (U+20000...U+2FFFF) sisältää joissakin kiinan murteissa käytettäviä harvinaisia merkkejä. Tasot 3–13 (U+30000...U+DFFFF) ovat tyhjiä, mutta tasolla 14 (U+E0000...U+EFFFF) on eräitä ei-graafisia teknisiä erikoismerkkejä. Tasot 15 ja 16 (U+F0000...U+10FFFF) on varattu yksityiseen käyttöön; näille tasoille voi periaatteessa kuka tahansa lisätä haluamiaan epävirallisia merkkejä, mutta ne toimivat vain samaa määrittelyä noudattavissa tietokonejärjestelmissä.
Tasot on jaettu edelleen erikokoisiksi lohkoiksi, joista kuhunkin on koottu yhden kirjoitusjärjestelmän merkkejä. Yhden kielen tarvitsemat merkit voivat kuitenkin jakaantua useaan lohkoon, koska Unicoden rakenne on pyritty pitämään mahdollisimman yhteensopivana vanhempien merkistöstandardien kanssa ja merkkivalikoimaa on lisäksi laajennettu vaiheittain. Esimerkiksi suomen oikeinkirjoituksessa tarvittavat suur- ja pienaakkoset A/a–Z/z (samoin kuin numerot 0–9 ja tavallisimmat välimerkit) ovat latinalaisessa perusosassa (Basic Latin: U+0000...U+007F), joka vastaa ASCII-merkistöä, mutta Ä/ä ja Ö/ö ovat latinalaisen merkistön täydennysosassa (Latin 1 supplement: U+0080...U+00FF). Š/š ja Ž/ž puolestaan ovat laajennusosassa A (Latin Extended-A: U+0100...U+017F). Vastaavasti muille merkkijärjestelmille, kuten kreikkalaisille, kyrillisille ja arabialaisille kirjaimille, on nimetty omat lohkonsa, ja muita lohkoja on varattu ASCIIsta puuttuville välimerkeille sekä muun muassa matemaattisille ja kielitieteellisille erikoismerkeille.

Unicoden alkupää

U+0000 - U+007F Latinalaiset perusaakkoset A-Z suur- ja pienaakkosina, numerot 0-9 ja tavallisimmat välimerkit 

U+0080 - U+00FF Latinalaisten kirjainten täydennysosa (kuten esim. Å/å, Ä/ä ja Ö/ö) 

U+0100 - U+017F Latinalaisen kirjaimiston laajennusosa A (kuten esim. Š/š ja Ž/ž) 

U+0180 - U+024F Latinalaisen kirjaimiston laajennusosa B (kuten esim. Ə/ə) 

U+0250 - U+02AF Ne IPA-merkit, jotka eivät ole latinalaisia perusaakkosia A-Z 

U+02B0 - U+02FF Muunnellut latinalaiset kirjaimet 

U+0300 - U+036F Tarkkeet 

U+0370 - U+03FF Kreikkalaiset kirjaimet 

U+0400 - U+04FF Kyrilliset peruskirjaimet 

U+0500 - U+052F Kyrillisen kirjaimiston täydennysosa

Merkistökoodaukset

Teknisesti Unicode-merkit voidaan koodata tiedostoihin eri tavoin. Unicode-standardin tukemat kolme koodaustapaa ovat UTF-8, UTF-16 ja UTF-32, joista kullakin on omat vahvuutensa.

UTF-32

Koodaustavoista suoraviivaisin on UTF-32. Siinä jokainen merkki tallentuu neljän tavun mittaisena eli kaikkiaan 32 bitin kokonaisuutena, mikä vaatii suhteellisen paljon tallennustilaa (koska 21-bittinen koodaus riittäisi kaikkien Unicode-merkkien yksilöimiseen, 32-bittistä koodausta käytettäessä on jokaisessa merkissä 11 ylimääräistä bittiä). 
Kuten UTF-16:sta, myös UTF-32:sta on kolme versiota: UTF-32LE ja UTF-32BE sekä sellainen, jossa käytetään tavujärjestysmerkkiä.

Unicoden käyttö

UTF-8-koodaus on nykyään melko laajassa käytössä, koska se mahdollistaa erikielisten tekstielementtien esiintymisen samalla sivulla. Vuoden 2007 lopulla UTF-8 olikin noussut Googlen indeksoimien nettisivujen suosituimmaksi koodaustavaksi. UTF-8 kehitettiin Plan 9-käyttöjärjestelmää varten.
Ennen Unicoden yleistymistä useimmat käyttöjärjestelmät tallensivat tekstin käyttäen omia ratkaisujaan, jotka eivät olleet keskenään yhteensopivia. Useimmissa merkistöissä oli tilaa korkeintaan 256 eri merkille. Tämän vuoksi yhdellä merkistöllä kyettiin tavallisesti tukemaan vain rajallista määrää eri kieliä. Unicode-tuki sisällytettiin Windows NT:hen jo vuonna 1993, mutta Windowsin 9x-versiot tarvitsivat vielä erillisen Unicode-laajennusosan. Linux-jakelijoista Red Hat asetti UTF-8-koodauksen ensimmäisenä järjestelmän oletusarvoksi syyskuussa 2002.
Uudemmat käyttöjärjestelmät yleensä sisältävät Unicode-tuen. Riippuen käyttöjärjestelmästä Unicode voi vaatia erikseen käyttöön ottamista esimerkiksi komentoriviympäristössä. 
Mobiililaitteista Unicodea tukevat muun muassa Android, iOS ja Symbian-laitteet. Kun mobiililaitteista yhä suurempi osa on älypuhelimia, niihinkin on mahdollista sisäänrakentaa monikielinen tuki.
Käyttöjärjestelmän lisäksi tarvitaan Unicodelle tukia myös ohjelmointikielissä. Vanhastaan C ja C++ ovat tukeneet ainoastaan ASCII-merkistöä tai muutamia käyttöjärjestelmän omia koodisivuja, mutta viime vuosina uusimmat standardit ovat lisänneet myös monitavuiset merkistöt näihin kieliin. Java käyttää kaiken tekstin tallentamiseen sisäisesti pelkästään Unicodea.