# 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 käyttää useampia tavuja (enemmän bittejä), mikä mahdollistaa huomattavasti enemmän merkkipaikkoja. Siten Unicodessa on enemmän tilaa kaikille maailman kielten käyttämille merkeille sekä erinäisille teknisille kontrolli- ja erityiskoodeille. Lisäksi tuettuna on joukko erilaisia emoji-merkkejä.

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.

Aikaisempiin merkistöihin kuuluu Xerox Character Code Standard (XCCS), jonka kokemuksista kiinteäkokoinen suunnitelma on toivottava muuttuvakokoisen sijaan.

Unicode ja ISO/IEC 10646 ovat kehitetty erillisinä standardeina, mutta näistä vastaavat tahot työskentelevät läheisessä yhteistyössä ja pitävät ne yhdenmukaisena. 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.

Unicoden ensimmäinen versio suunniteltiin 16-bittiseksi, mikä mahdollisti 65 536 merkkipaikan koodiavaruuden. Unicoden versiosta 2.0 lähtien se ei ole ollut 16-bittinen.
Kun huomattiin ettei 16-bittinen koodaus riitä 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.

Unicodelle on erilaisia koodaustapoja, joita ovat UTF-8, UTF-16 ja UTF-32. Nämä ovat yhdestä neljään 8-bittistä tavua, yksi tai kaksi 16-bittistä yksikköä tai yksi 32-bittinen yksikkö. Koodauksen UCS-2 on korvannut UTF-16. UTF-EBCDIC on EBCDIC-merkistön kanssa käytettävä muunnos.

Unicode versiossa 14.0 on 144 697 merkkiä. Versiossa 16.0 on 154 998 merkkiä. Mukana on seitsemän uutta modernia ja historiallista kirjoitusjärjestelmää.

## Unicoden rakenne

Yleiskaavio Unicode-merkistön tasosta 0 eli moni­kielisestä perus­tasosta erivärisine lohko­ryhmineen. Tummanharmaat lohkot sisältävät latinalais­peräisten kirjoitus­järjestelmien merkkejä. Suurimmat ryhmät muodostuvat itäaasialaisten kielten punaisista ja korallin­värisistä lohkoista. (Kaavioon on myös merkitty neli­numeroisten heksadesimaali­tunnusten kaksi ensimmäistä numeroa; kukin numeropari edustaa 256:ta merkki­paikkaa ja vastaa siis laajuudeltaan kahdeksan­bittistä merkistöä.)
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 tasot 2–3 (U+20000...U+3FFFF) sisältävät harvinaisia kiinalaisen kirjoitusjärjestelmän merkkejä. Tasot 4–13 (U+40000...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 kuka tahansa lisätä 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 | kirjaimet, joiden tarkoitus on muunnella edellistä kirjainta (esim. ʰ) |
| U+0300…U+036F | tarkkeet, jotka yhdistyvät edelliseen merkkiin (esim. akuuttiaksentti, joka muuttaa a-kirjaimen á:ksi) |
| 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-8

UTF-8 on Unicoden vaihtelevanpituinen koodaustapa. Sen etuna on osittainen yhteensopivuus vanhempien järjestelmien kanssa, jotka käsittelevät merkkejä kahdeksanbittisinä tavuina eli oktetteina. UTF-8 on rakennettu siten, että ASCII-merkistöä vastaavat eli latinalaiseen perusosaan kuuluvat merkit (mm. kirjaimet Aa–Zz) koodautuvat täsmälleen samoin kuin ASCIIssa käyttäen tavusta vain seitsemää bittiä. Kahdeksas bitti (jonka avulla ASCIIta on vanhastaan voitu laajentaa muun muassa Latin 1 ‑merkistöksi) puolestaan määrittää, edustaako tavu tiettyä merkkiä sellaisenaan vai onko se jonkin monitavuisena koodautuvan merkin alkuosa. Näin ne merkit, jotka eivät sisälly ASCIIhin, voidaan koodata kahden tai useamman tavun jonoina.

Tunnuksen koodipaikasta riippuen yksi merkki vie tallennettuna tilaa yhdestä neljään tavua. Merkin vaatima tavumäärä riippuu koodipaikasta seuraavasti:

* U+0000...U+007F: yksi tavu (latinalainen perusosa eli ASCII)
* U+0080...U+07FF: kaksi tavua (mm. Latin 1 ja suuri osa muista eurooppalaisista sekä Lähi-idän merkistöistä)
* U+0800...U+FFFF: kolme tavua (loput monikielisen perustason merkit)
* U+10000...U+10FFFF: neljä tavua (muiden tasojen merkit)

UTF-8:ssa tavut esittävät merkkiä seuraavasti:

| Tavuja | Tavujen bitit | Koodipaikan bitit |
| --- | --- | --- |
| 1 | `0aaaaaaa` | `00000000000000aaaaaaa` |
| 2 | `110aaaaa 10bbbbbb` | `0000000000aaaaabbbbbb` |
| 3 | `1110aaaa 10bbbbbb 10cccccc` | `00000aaaabbbbbbcccccc` |
| 4 | `11110aaa 10bbbbbb 10cccccc 10dddddd` | `aaabbbbbbccccccdddddd` |

Esimerkit:

| Koodipaikka | Koodipaikan bitit | Tavujen bitit | Tavut heksadesimaalimuodossa |
| --- | --- | --- | --- |
| U+0045 | `000000000000001000101` | `01000101` | `45` |
| U+0431 | `000000000010000110001` | `11010000 10110001` | `D0 B1` |
| U+5B57 | `000000101101101010111` | `11100101 10101101 10010111` | `E5 AD 97` |
| U+1F603 | `000011111011000000011` | `11110000 10011111 10011000 10000011` | `F0 9F 98 83` |

Latin 1 ‑lohkoon sisältyvät merkit (mm. Å/å, Ä/ä ja Ö/ö) koodautuvat siis kaksitavuisina ja muut monikielisen perustason merkit kaksi- tai kolmitavuisina. Koska latinalaisilla kirjaimilla kirjoitettu teksti vie tallennustilaa enimmäkseen vain yhden tai välillä kaksi tavua merkkiä kohti, tiedostojen koko ei kasva merkittävästi isommaksi kuin 8-bittistä merkistöä käytettäessä. Sen sijaan kolmitavuisin merkein kirjoitettavien itäaasialaisten kielten näkökulmasta UTF‑8 voi vaikuttaa tuhlailevalta koodaustavalta.

Perinteisiin kahdeksanbittisiin merkistöihin verrattuna UTF-8:n etuna on, että se on helppo tunnistaa automaattisesti. Toisin kuin Itä-Aasiassa perinteisesti käytetty ISO 2022 ‑koodaus, UTF‑8 on lisäksi tilaton (esitetty merkki riippuu pelkästään kyseistä merkkiä esittävästä tavujaksosta), joten osin turmeltuneen tiedoston datasta menetetään vain turmeltunut osa, ei koko loppua tekstiä. UTF-8:ssa merkin aloittavan tavun voi myös aina erottaa merkkiä jatkavasta tavusta.

Teoriassa pidempi tavujakso voi myös esittää merkkiä, jolle riittäisi lyhyempikin tavujakso. Tällaisia 'ylipitkiä' koodauksia ei sallita standardissa. UTF-16:n takia varattuja sijaismerkkejä (ks. alla) ei myöskään sallita UTF-8:ssa.

UTF-8-standardi kuvataan myös RFC-dokumentissa RFC 3629.

### UTF-16

UTF-16:ssa yksittäinen merkki tallentuu aina vähintään tavuparina eli 16 bitin kokonaisuutena. Monikieliseen perustasoon sisältyvien merkkien (U+0000...U+FFFF) tallentamiseen riittää yksi tavupari, joten lähes kaikki nykyaikaisten kielten tarvitsemat merkit ovat koodattavissa kahdella tavulla. Tästä seuraa, että pääasiassa itäaasialaisia merkkejä sisältävät tiedostot vievät vähemmän tallennustilaa kuin UTF‑8:aa käytettäessä. Toisaalta sellaiset tiedostot, jotka pääosin koostuvat ASCII-merkeistä, vievät enemmän tallennustilaa kuin UTF‑8:aa käytettäessä.

Muilla kuin monikielisellä perustasolla sijaitsevien merkkien (U+10000...U+10FFFF) tallentamiseen tarvitaan kaksi tavuparia. Tällöin hyödynnetään monikieliseen perustasoon sisältyviä niin sanottuja *sijaismerkkejä* (engl. *surrogate code points*), joita on kaikkiaan 2048 jaettuina kahteen 1024 merkin ryhmään (*high surrogates* U+D800..U+DBFF ja *low surrogates* U+DC00..U+DFFF). Niiden avulla muodostettavat yhdistelmät riittävät ylimpien 16 tason merkkien koodaamiseen (1024 × 1024 = 16 × 65 536 = 1 048 576).

UTF-16:sta on kolme versiota, joiden erot selittyvät tavujärjestyksen eroilla:

1. UTF-16BE on *big endian*, jossa kukin tavupari alkaa enemmän merkitsevällä tavulla.
2. UTF-16LE on *little endian*, jossa kukin tavupari alkaa vähemmän merkitsevällä tavulla.
3. Kolmannessa vaihtoehdossa tavujärjestys on avoin, jolloin tekstin tulisi alkaa koodilla U+FEFF (engl. *zero width no-break space* tai epävirallisesti mutta osuvammin *byte order mark* eli BOM; kyseessä on vanhentunut sitovan tyhjeen merkki, jonka tehtävä Unicoden varhaisten versioiden mukaan oli automaattisen rivinvaihdon estäminen mutta jota nykyään käytetään ensisijaisesti tavujärjestyksen osoittimena). Tavujärjestykseltään käänteinen tunnus U+FFFE on pysyvästi määritelty niin sanotuksi epämerkiksi (engl. *noncharacter*). Jos siis aloitusmerkki näyttäisi olevan U+FFFE, joka on Unicodessa laiton, sen täytyy todellisuudessa olla U+FEFF, jonka vähemmän merkitsevä tavu (FF) on tallentunut ensin eli alempaan muistipaikkaan. Aloitusmerkin jälkeen muut merkit noudattavat samaa tavujärjestystä.

### 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ä.

### Muut

* UTF-7 (RFC 2152) on ehdotus Unicoden koodaamiseen 7-bittisten ASCII-merkistön merkkien avulla. Tarve koodaukselle on kuitenkin ollut vähäistä. UTF-7:n tuki on kielletty HTML5-standardissa ennakoimattoman käytöksen vuoksi.
* Punycode on RFC 3492:ssa määritelty koodaus Unicoden käytölle DNS-nimissä. Sitä käytetään mahdollistamaan ääkköset web-sivustojen nimissä.
* UCS-2 standardi oli varhainen versio Unicodesta, joka oli rajoitettu 65 535 merkkiin, mutta tarve on tukea enemmän merkkejä. UTF-16 standardi on korvannut UCS-2:n.

## 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. Tammikuussa 2024 UTF-8 -merkistöä käytti 98,1% kaikista verkkosivustoista.

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.

## Lähteet

## Aiheesta muualla

*
* DecodeUnicode - Unicode WIKI 50.000 gifs