Mikä on merkki?

Johdatus merkin käsitteeseen tietotekniikassa
Jukka K. Korpela

Merkin käsite on datatekniikassa (tieto­tek­nii­kas­sa) olennainen ja osittain erilainen kuin yleiskielessä. Tämä lyhyehkö juttu pyrkii selostamaan asian mahdollisimman yleistajuisesti.

Osa tässä jutussa esiintyvistä erikoismerkeistä ei näy oikein läheskään kaikissa Web-selaimissa. Ne kuitenkin esitetään vain havainnollisuuden vuoksi yhteyksissä, joissa toivottavasti selviää sanallisista selityksistä, mitä merkkejä tarkoitetaan.

Merkki ja merkin idea

Merkki, englanniksi character, on kirjoituksen alkeisosanen. Merkkejä ovat muun muassa kirjaimet, numerot, välimerkit ja erikoismerkit kuten pykälän merkki (§) mutta myös esimerkiksi tavu- ja sanamerkit, joita käytetään monissa kirjoitusjärjestelmissä. Mukana on jonkin verran myös kuvasymbolin luonteisia merkkejä kuten korttipakan maiden symbolit (♠♣♥♦). Peruslähtökohtana on kuitenkin, että kyse on kirjoituksessa (tekstissä) käytettävistä merkeistä; piirros- ja muut kuvat ovat eri juttu.

Tietokoneilla tehtävässä tekstien käsittelyssä on kyse merkkien kirjoittamisen ja tallentamisen ohella myös merkkijonojen monenlaisesta käsittelystä, kuten lajittelusta, hakutoiminnoista ja tekstin automaattisesta muokkaamisesta annettujen sääntöjen mukaan. Tätä varten on merkkien sisäisen esitysmuodon vastattava abstraktin merkin ideaa: abstrakti merkki on merkin muoto ja tarkoitus, erotettuina sen ulkoasun vaihtelusta. Jos esimerkiksi merkin tallennusmuoto vastaisi aina sen yhtä erityistä ulkoasua eli olisi ikään kuin merkin kuva, olisivat useimmat toimenpiteet erittäin hankalia.

Merkin erityisen ulkoasun käsittely on kyllä joissakin tilanteissa tarpeen. Esimerkiksi tekstin lukemisessa paperista tietokoneen muistiin erityisellä laitteella, skannerilla, ja sitä tukevalla ohjelmistolla on kyse juuri siitä. Mutta siinä tavoitteena on juuri tunnistaa, mitä abstraktia merkkiä kukin paperilla oleva kuvio edustaa, ja tallentaa tieto tästä. Tämän jälkeen voidaan teksti esimerkiksi tallentaa tietokantaan, josta tehdään hakuja tehokkaasti. Alkuperäinen tekstin ulkoasu saatetaan kyllä haluta myös säilyttää, mutta ihmisten katseltavaksi, ei juurikaan tietokoneella käsiteltäväksi.

Merkin erityistä ulkoasua kutsutaan glyyfiksi (englanniksi glyph). Tätä sanaa käyttävät enimmäkseen vain merkistökysymysten asiantuntijat, mutta sana fontti, joka tarkoittaa glyyfien kokoelmaa, on yleisemmin tunnettu; sen asemesta käytetään etenkin kirjapainoalalla sanaa kirjasinleikkaus. Esimerkiksi Arial-fontin l-kirjain (pieni äl) on aika erinäköinen kuin Courier-fontin l-kirjain. Ne ovat kuitenkin vain saman merkin eri glyyfejä. Niiden esitykset merkkinä tietokoneessa ovat samat; tieto fontista tallentuu erikseen, eri ohjelmissa ja tiedostomuodoissa eri tavoin.

Viime kädessä on määrittelykysymys, milloin kyseessä on kaksi eri merkkiä ja milloin saman merkin kaksi eri ulkoasua. Joskus ratkaisut voivat tuntua mielivaltaisilta. Merkistösopimuksissa on esimerkiksi määritelty, että dollarin merkissä $ voi olla yksi tai kaksi pystyviivaa, kun taas punnan merkissä £ on olennaista, että siinä on vain yksi poikkiviiva; vastaava merkki, jossa on kaksi poikkiviivaa, tulkitaan eri merkiksi, liiran merkiksi (₤). Omalla tavallaan mielivaltainen on sekin ratkaisu, että meille tuttu latinalainen A-kirjain tulkitaan eri merkiksi kuin venäjässä käytetty kyrillinen A tai kreikassa käytetty iso alfa-kirjain, vaikka kaikki kolme yleensä ovat ulkoasultaan samoja tai hyvin samanlaisia ja ovat lisäksi historiallisesti samaa alkuperää.

Merkki on koodattava

Tieto siitä, mikä abstrakti merkki on kyseessä, joudutaan koodaamaan jollakin tapaa. Tämä perustetaan johonkin merkistösopimukseen, joka määrittelee joukon abstrakteja merkkejä, joilla on nimet, numerot ja jonkinlainen muodon kuvaus. Muoto kuvataan yleensä esittämällä merkin jokin tyypillinen ulkoasu kuvana; lukijan oletetaan ymmärtävän, että tarkoitetaan yleistä muotoa, ei erityistä ulkoasua. Joskus on tarpeen selventää sanallisesti, mikä kuuluu muotoon olennaisena osana ja missä asioissa on vaihtelua.

Merkin koodinumero on olennainen siksi, että numeerinen esitys on käytännössä välttämätön tietokoneissa. Koodinumero on aina suhteellinen, suhteessa johonkin merkistösopimukseen. Epäselvyyksiä ei synny, kunhan tekstitiedoston mukana kulkee aina tieto siitä, minkä merkistösopimuksen mukaan se tulee tulkita.

”Tavalliset” merkistösopimukset

Käytännön syistä vanhimmat merkistösopimukset olivat varsin suppeita. Edelleenkin käytetään vielä erittäin laajasti niin sanottuja kahdeksanbittisiä merkistöjä, joissa koodinumerot ovat välillä 0:sta 255:een. Kyseisissä sopimuksissa eivät edes ole käytössä kaikki 256 koodinumeroa eli merkkipaikkaa (merkkipositiota), vaan eräistä teknisistä syistä osa on varattu niin sanotuille ohjauskoodeille tai jätetty käyttämättä. Ohjauskoodeilla voidaan saada aikaan mm. rivinvaihtoja.

Nimitys ”kahdeksanbittinen” johtuu siitä, että tämän lukualueen luvut ovat esitettävissä kahdeksalla binaarinumerolla eli bitillä. Kahdeksan bitin ryhmää kutsutaan usein nimellä oktetti ja vielä useammin (mutta epätäsmällisimmin) nimellä tavu, englanniksi byte. Oktetti on useimmissa nykyisissä tietokoneissa datan käsittelyn perusyksikkö.

Yksi tapa havainnollistaa merkkien koodaamisen ideaa on ajatella, että merkistösopimusta vastaa kirjasinlaatikosto, jossa on yhtä monta laatikkoa kuin käytössä on koodinumeroita. Kussakin laatikossa on kirjasimia yhden merkin painamiseen. Kun tietokone tulostaa tekstiä, jossa merkit siis on esitetty koodinumeroilla, niin numero ohjaa koneen ottamaan kirjasimen sitä vastaavasta laatikosta. Vaihtamalla kaikki kirjasimet jonkin toisen kirjasintyylin (leikkauksen) mukaisiksi saadaan aikaan, että sama teksti tulostuu erinäköisenä.

Suomessa nykyisin yleisimmin käytetyt merkistösopimukset ovat windows-1252 ja iso-8859-1. Niistä jälkimmäinen tunnetaan yleisesti nimellä ISO Latin 1; virallisesti sen nimi on suomeksi ”latinalaisaakkosto 1”. Se on laajasti käytössä muuallakin, missä käytetään länsi- ja pohjoiseurooppalaisia kieliä, joita varten se on suunniteltu. Ks. kuvausta ISO-Latin-1-merkistöstä.

Windows-1252 eli Windows Latin 1 on Microsoft-yhtiön Windows-järjestelmissä käytetty merkistö, joka sisältää iso-8859-1:n merkkien lisäksi muutamia erikoismerkkejä, mm. ajatusviivat, sijoitettuina paikkoihin (koodinumeroille), jotka on iso-8859-1:ssä varattu ohjauskoodeille. Tästä seuraa, että Windows-järjestelmässä kirjoitettu tekstitiedosto ei suinkaan aina näy oikein muunlaisissa järjestelmissä; käyttäjän on osattava varoa käyttämästä kyseisiä lisämerkkejä tai muokattava tiedostoa ennen sen lähettämistä toisenlaiseen järjestelmään.

Iso-8859-1 sisältää osajoukkonaan vanhan ja edelleen hyvin laajasti käytetyn, alkujaan amerikkalaisen Ascii-merkistön. Ascii on seitsenbittinen eli siinä koodinumerot ovat välillä 0:sta 127:ään. Toisin päin sanottuna iso-8859-1 on yksi Asciin laajennus kahdeksanbittiseksi. Muita laajennuksia on hyvin paljon, ja niitä on tehty eri kielten ja kirjoitusjärjestelmien tarpeisiin. Yksi uudehko merkistösopimus on iso-8859-15 (ISO Latin 9, latinalaisaakkosto 9, joka on muokattu iso-8859-1:stä korvaamalla muutama harvoin käytetty erikoismerkki tarpeellisemmilla merkeillä, kuten euron merkki (€) ja hattu-s (š).

Unicode

Unicode on merkistösopimus, joka alkujaan suunniteltiin 16-bittiseksi mutta laajennettiin 32-bittiseksi, joskin se myöhemmin supistettiin loogisesti 21-bittiseksi. Tämä merkitsee, että käytettävissä on ”tilaa”, siis koodinumeroita, ihan riittävästi kaikkiin tarpeisiin. Kuitenkin alkuperäinen 16-bittisyys ilmenee käytännössä siinä, että 16 bitillä esitettävissä olevien koodinumeroiden alue, 0:sta 32 767:een, on erikoisasemassa. Sitä kutsutaan nimellä Basic Multilingual Plane (BMP), ja siihen kuuluvat useimmat yleisesti käytetyt merkit. Alue on kuitenkin liian ahdas, sillä esimerkiksi kiinan kirjoitusmerkeistä siihen mahtuu vain osa.

Unicoden ohella puhutaan myös ISO 10646 -merkistöstä. Alkujaan kyseessä oli kaksi erillistä hanketta laajan merkistön määrittelemiseksi, mutta sittemmin ne on yhdenmukaistettu keskenään, vaikka niitä edelleen ylläpidetään kahtena erillisenä standardina. Unicode-standardi sisältää kuitenkin enemmän kannanottoja merkkien merkitykseen ja käyttöön. On tavallisempaa puhua Unicodesta kuin ISO 10646:sta, muuan muassa siksi, että nimi ”Unicode” on sujuvampi.

Unicode-sopimuksen mukaisessa tekstin esitysmuodossa yksinkertaisin tapa olisi esittää kukin merkki tasan 32 bitin jonona. Tämä tarkoittaisi, että esimerkiksi suomenkielinen tekstitiedosto olisi neljä kertaa niin iso kuin sama teksti iso-8859-1:n mukaisessa koodauksessa. Tähän ei useinkaan ole varaa, vaikka tietojenkäsittelytehon hinta koko ajan laskeekin. Niinpä käytetään erilaisia esityskoodauksia, joista tavallisin tunnetaan nimellä UTF-8. Sitä käytettäessä esimerkiksi englanninkielinen teksti vie vain saman verran tilaa kuin iso-8859-1:n mukaan koodattuna; suomenkielinenkin vie vain jonkin verran enemmän. Muita Unicoden esityskoodauksia ovat UCS-2 ja UTF-7. Mutta tällaiset koodaukset on erotettava siitä perustavammanlaatuisesta koodauksesta, jossa merkit esitetään koodinumeroilla. Abstraktia merkkiä vastaava koodinumero on luonteeltaan matemaattinen luku, joka voidaan esittää erilaisilla tavoilla, esimerkiksi ”42”, ”0x28”, ”XLII” tai ”neljäkymmentäkaksi”. Esityskoodauksessa on kyse jostakin erityisestä tavasta esittää luvut tietokoneiden sisäisessä esitysmuodossa ja niiden välisessä datansiirrossa.

Unicode-konsortion sivuilla on esite Unicodesta eri kielillä, myös suomeksi: Mikä on Unicode?

Unicode-standardi on luettavissa Webistä. Se on kuitenkin osittain vaikeatajuinen ja hankalasti jäsennetty, joten suosittelen sen lukemisen seuralaiseksi ohjettani Guide to the Unicode standard.

Unicode-tuki on suhteellista

Monet nykyaikaiset tietokonejärjestelmät käyttävät sisäisesti Unicodea, vaikka niissä käytettävät ohjelmat eivät ehkä vielä tuekaan kuin vanhoja, suppeita merkistöjä. Hyvin usein tilanne onkin turhauttava: jotta esimerkiksi saataisiin jokin erikoismerkki paperille, on hyvin monen ohjelman toimittava oikein, ja yksikin vanha ohjelma matkan varrella riittää sotkemaan koko homman. Onkin leikillisesti mutta realistisesti sanottu, että julkaistaessa juttua, joka käsittelee merkistöongelmia, aina menee jotain pieleen tavalla, joka havainnollistaa niitä ongelmia.

Toisaalta järjestelmällä, joka itsessään ei tue Unicodea, voidaan usein tuottaa ja käsitellä Unicode-merkkejä. Ehkä tunnetuin esimerkki tätä nykyä on Webissä julkaiseminen. Vaikka käyttämäsi tietokonejärjestelmän mikään osa ei osaisi kuin iso-8859-1-merkistön (tai vaikka vain Ascii-merkistön), voit silti sisällyttää Web-sivuillesi minkä tahansa Unicode-merkin esittämällä sen HTML-merkkauksessa muodossa &#luku;, missä luku on merkin koodinumero Unicodessa. Esimerkiksi pieni hattu-s (š) voidaan esittää muodossa š. Eri asia on, että Web-selaimet eivät suinkaan vielä aina selviä sellaisesta.

Unicode ”välikielenä” ja määrittelyjen perustana

Unicodea käytetään yleisesti erilaisten merkistösopimusten välisissä muunnoksissa. Jos on tehtävä ohjelma, joka tuntee esimerkiksi 20 erilaista merkistösopimusta, niin kaikkien niiden välisten muunnosten suora toteuttaminen vaatisi 380 (20 × 19) eri muunnostaulukkoa tai muunnosrutiinia. Jos sen sijaan yksi merkistösopimuksista on Unicode ja kaikki muunnokset tehdään sen kautta, riittää 38 muunnostaulukkoa tai -rutiinia, eli 19 muunnosta muista sopimuksista Unicodeen ja saman verran toiseen suuntaan.

Olennaista tässä on tietenkin se, että Unicode-merkistöön sisältyvät muiden merkistöjen kaikki merkit. Tämä mahdollistaa myös sen, että Unicodea käytetään perustana, kun halutaan tehdä merkistösopimuksia, määritellä miten eri merkkejä käsitellään eri tilanteissa tai vain puhua eri merkeistä. Esimerkiksi uuden kahdeksanbittisen merkistön määrittelemiseksi riittää, että laaditaan taulukko, joka kuvaa vastaavuuden sen koodinumeroiden ja Unicode-koodinumeroiden välillä. Periaatteessa merkkejä ei tällöin tarvitse edes mainita nimeltä saati esittää näkyvässä muodossa!

Unicode onkin laajasti käytössä referenssipohjana, aivan siitä riippumatta, mikä merkkien koodaus on käytössä. Merkkeihin viitattaessa käytetään usein merkintätapaa U+nnnn, missä nnnn on merkin koodinumero Unicodessa heksadesimaalisena eli 16-kantaisessa lukujärjestelmässä. On tietysti hyvin teknistä, mutta samalla tiivistä ja täsmällistä, puhua vaikkapa merkistä U+2039 (jonka nimi Unicodessa on epäkäytännöllisen pitkä: single left-pointing angle quotation mark). Itse asiassa sellainen menettely on usein ainoa tarpeeksi täsmällinen tapa, koska nimet vaihtelevat (jopa Unicoden eri versioiden välillä) ja koska pelkkä merkin ulkoasun kuvaus johtaa helposti harhaan. Esimerkiksi äsken mainittu merkki (‹) saattaa joissakin ilmentymissään kovasti muistuttaa pienikokoista pienemmyysmerkkiä (<).

Lisätietoja

Markku Immonen on kirjoittanut sivun Merkistöistä (arkistokopio). Se muun muassa kuvailee edellä mainittuja merkkikoodeja tarkemmin, etenkin Web-sivujen tekemisen kannalta.

Esityksiä kirjoitusjärjestelmistä ja niiden historiasta:

Laaja englanninkielinen yleisesitys merkin käsitteestä sisältyy dokumenttiin A tutorial on character code issues, joka sisältää myös linkkilistan.

Vielä paljon perusteellisempi esitys on kirjassani Unicode Explained (O’Reilly, 2006).