Kirjainten tarinoita, luku 2 Kirjaimiston synty :

2.6 Merkki ja merkin idea

Merkin käsite on tietotekniikassa keskeinen ja osittain erilainen kuin yleiskielessä. Tässä esitetään yleiskatsaus aiheeseen. Huomattavasti perusteellisempi esitys on kirjassani Unicode Explained (O’Reilly, 2006).

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ä. Siinä pyritään tunnistamaan, mitä abstraktia merkkiä kukin paperilla oleva kuvio edustaa, ja tallentamaan 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.

Glyyfi ja fontti

Merkin erityistä ulkoasua kutsutaan glyyfiksi (englanniksi glyph). Tätä sanaa käyttävät enimmäkseen vain merkistökysymysten asiantuntijat. Sana fontti, joka tarkoittaa glyyfien kokoelmaa, on yleisemmin tunnettu; sen asemesta käytetään etenkin kirjapainoalalla sanaa kirjasinleikkaus tai kirjainleikkaus. Esimerkiksi Arial-fontin tai muun groteskifontinl-kirjain (pieni äl) on aika erinäköinen kuin Courier New -fontin tai muun tasalevyisen fontinl-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. Sen sijaan punnan merkissä £ on olennaista, että siinä on vain yksi poikkiviiva; vastaava merkki, jossa on kaksi poikkiviivaa, tulkitaan eri merkiksi, liiran merkiksi (₤); Turkin rahayksikön merkki on saman teeman muunnelma, mutta sekin on (v:sta 2012) koodattu omaksi merkikseen Turkin liira (₺). 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 (leik­kauk­sen) mukaisiksi saadaan aikaan, että sama teksti tulostuu erinäköisenä.

Suomessa nykyisin yleisimmin käytetyt merkistösopimukset ovat windows-1252 ja iso-8859-1 sekä jäljempänä kuvattava UTF-8. Iso-8859-1 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.

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.

Unicode

Unicode on merkistösopimus, joka alkujaan suunniteltiin 16-bittiseksi mutta laajennettiin 32-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 yhden­mukais­tet­tu 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 koo­dauk­ses­sa. 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. 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”. Esitys­koodauksessa on kyse jostakin erityisestä tavasta esittää luvut tietokoneiden sisäisessä esitysmuodossa ja niiden välisessä datansiirrossa.

Unicode-standardi on vapaasti luettavissa osoitteen www.unicode.org kautta.

Unicoden merkistöstä käytetään myös nimitystä Universal Character Set (UCS), jolle on käytetty suomennosta yleismerkistö. Sopivampi nimi olisi kuitenkin universaalimerkistö, koska yleis-alun voidaan luulla viittaavan siihen, että kyse olisi yleisimmin käytetyistä merkeistä.

Unicode-tuki on suhteellista

Monet nykyaikaiset tietokonejärjestelmät käyttävät sisäisesti Unicodea, vaikka niissä käy­tet­tä­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. Yksikin vanha ohjelma matkan varrella riittää rikkomaan toimivuuden. Onkin leikillisesti mutta realistisesti sanottu, että julkaistaessa juttua, joka käsittelee merkistöongelmia, aina menee jotain pieleen tavalla, joka havainnollistaa kyseisiä 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 koodi­numero Unicodessa. Esimerkiksi pieni hattu-s (š) voidaan esittää muodossa š. Eri asia on, että Web-selaimet eivät aina osaa näyttää kaikkia Unicode-merkkejä, lähinnä fonttien rajoittuneisuuden takia.

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!

Merkintätapa U+nnnn

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 luku­järjes­tel­mäs­sä. Tässä järjestelmässä käytetään numeroiden 0–9 lisäksi kirjaimia A–F numeroina, jotka tarkoittavat lukuja 10–15. Heksadesimaalisesta järjestelmästä kerrotaan jäljempänä A:n tarinassa, mutta käytännössä merkintöjä nnnn voi pitää koodeina, joiden sisäistä rakennetta ei tarvitse ymmärtää.

Unicode-merkkeihin viitataan usein vain koodinumeroilla, esimerkiksi 2039. Alkuosa ”U+” ei ole mitenkään välttämätön, mutta sillä voidaan ilmaista havainnollisesti, että kyseessä on Unicode-koodinumero eikä esimerkiksi luku tavanomaisessa mielessä tai jokin muu koodi. (Merkinnän ”U+” taustaa käsitellään U:n tarinassa.)

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ä (<).

Merkkien kirjoittaminen

Merkkien kirjoittamista tietokoneella käsitellään laajahkosti tämän kirjan luvussa 7. Tässä esitetään vain lyhyt yleiskatsaus muutamiin tavallisiin menetelmiin. Käyttöympäristöksi oletetaan tässä tavanomainen henkilökohtainen tietokone, jossa on Windows-käyttö­järjes­tel­mä, ja normaali suomalainen näppäimistö.

Tavallisessa tietokoneen näppäimistössä on omat näppäimet vain suhteellisen pienelle määrälle merkkejä. Yleisesti tunnettua on, että vaihto- eli shift-näppäimen avulla voidaan säätää sitä, tuottaako kirjainnäppäin gemenakirjaimen (”pienen kirjaimen”) kuten ”a” vai versaalikirjaimen (”ison kirjaimen”) kuten ”A”. Hiukan ristiriitaista on, että näppäimiin on yleensä merkitty (kaiverrettu tai maalattu) versaalikirjaimet, vaikka perustilassa näppäin tuottaa gemenakirjaimen. Vaihtonäppäimen avulla voidaan myös saada aikaan useita erikoismerkkejä kuten numeronäppäinten rivin näppäimistä huutomerkin (!), pystyn lainaus­merkin ("), ristikkomerkin (#) jne.

Hiukan vähemmän tunnettua on, että välilyöntinäppäimen oikealla puolella olevaa AltGr-näppäintä (ei Alt-näppäintä, joka on vasemmalla puolella) voidaan käyttää samaan tapaan. Kun painetaan AltGr-näppäin alas ja – sitä alhaalla pitäen – näpäytetään E-näppäintä, syntyy euron merkki €. (Jos näin ei käy, kyseessä saattaa olla vanha tietokone, johon ei ole tehty ns. europäivitystä.) Tällaista näppäilyä merkitään eri ohjeissa ja oppaissa eri tavoilla varsin kirjavasti: AltGr(e), AltGr+e, AltGr-e, Alt Gr E, ALT GR e jne. Tässä kirjassa lisätään kirjavuutta: käytämme merkintää AltGr(e). Näin voidaan esittää asiat yksiselitteisemmin. Merkintä ”AltGr(” voidaan lukea ”paina AltGr-näppäin alas äläkä päästä sitä ylös, ennen kuin saat luvan”, ja merkintä ”)” luetaan tällöin ”nyt saat päästää ylös sen näppäimen, jonka viimeksi painoit alhaalla pidettäväksi”. Merkintä ”e” tarkoittaa tällöin yksinkertaisesti E-näppäimen painamista.

AltGr-näppäimellä voidaan tuottaa seuraavat merkit:

– AltGr(e) tuottaa €:n, euron merkin
– AltGr(2) tuottaa @:n, ät-merkin, joka esiintyy mm. sähköpostiosoitteissa
– AltGr(3) tuottaa £:n, punnan merkin
– AltGr(4) tuottaa $:n, dollarin merkin
– AltGr(7) tuottaa {:n, vasemman aaltosulkeen
– AltGr(8) tuottaa [:n, vasemman hakasulkeen
– AltGr(9) tuottaa ]:n, oikeanpuoleisen hakasulkeen
– AltGr(0) tuottaa {:n, oikeanpuoleisen aaltosulkeen
– AltGr(+) tuottaa \:n, kenoviivan, jota käytetään tietotekniikassa
– AltGr(<) tuottaa |:n, pystyviivan.
– AltGr(m) tuottaa µ:n, mikro-merkin (vaikka tätä ei yleensä ole merkitty näppäimistöön).

Laajennetussa näppäimistöasettelussa, ns. suomalaisessa kansainvälisessä näppäimistö­asette­lus­sa, josta kerrotaan luvussa 7, voi AltGr-näppäimen avulla tuottaa monia muitakin merkkejä. Esimerkiksi ajatusviiva ”–” tuotetaan yhdistelmällä AltGr(-).

Lisäksi eri tietokoneohjelmissa on hyvinkin monia erilaisia tapoja kirjoittaa sellaisia merkkejä, joita ei löydy suoraan näppäimistöstä. Tällainen on esimerkiksi Windowsin Merkistö-ohjelma (Character Map), jonka avulla voidaan tekstiin lisätä mikä tahansa kirjoitusmerkki. On myös erillisiä apuohjelmia tällaisiin tarkoituksiin.

Tarkenäppäimet

Tarkenäppäimet merkittyinä.

Tarkkeiden kirjoittaminen on usein helppoa, kunhan opettelee yksinkertaisen periaatteen. Tavallisessa suomalaisessa näppäimistössä on kirjainnäppäimistön oikeassa yläreunassa kaksi erikoisnäppäintä, joita englanniksi kutsutaan nimellä dead key. Suomen kieleen suositellaan niille nimeä tarkenäppäin. Ylemmässä tarkenäppäimessä on akuutti aksentti ”´” ja gravisaksentti ”`”. Alemmassa taas on treema ”¨”, tilde ”~” ja sirkumfleksi ”^”. Jos näille näppäimille halutaan antaa omat nimet, niin aksenttinäppäin ja treemanäppäin lienevät sopivia.

Esimerkiksi ”á” kirjoitetaan näpäyttämällä ensin ylempää tarkenäppäintä, sitten a-näppäintä. Vasta tällöin tulee näkyviin jotain, nimittäin á-kirjain. Nimi dead key ’kuollut näppäin’ viittaakin siihen, että tarkenäppäin ei yksinään vielä tee mitään. Vastaavasti merkki ”à” kirjoitetaan siten, että ensin näpäytetään tarkenäppäintä niin, että vaihtonäppäintä pidetään alhaalla, sitten näpäytetään a-näppäintä.

Tildeä (aaltoviivaa) ”~” lisättäessä tarvitaan apuna AltGr-näppäintä, kuten voidaan päätellä tilde-symbolin sijainnista näppäinhatussa. Esimerkiksi Õ:n kirjoittaminen voidaan kuvata näin: AltGr(¨) vaihto(o). – Jos halutaan kirjoittaa tilde ”~” itsenäisenä merkkinä eikä kirjaimen päälle tarkkeeksi, se kirjoitetaan ikään kuin välilyöntiin liittyväksi merkiksi: AltGr(¨) välilyönti.

Näillä tavoilla voidaan kirjoittaa useimmat länsi- ja pohjoiseurooppalaisissa kielissä tarvittavat kirjainten lisämerkit, tarkemmin sanoen seuraavat kirjaimet: àáäâã èéëê ìíïî ñ òóöôõ ùúüû ýÿ sekä vastaavat versaalikirjaimet (paitsi Ÿ).

Menetelmä tarkkeellisten kirjainten kirjoittamiseen toimii kaikissa tavallisissa tilanteissa Windows-ympäristössä (ja usein muuallakin). Vanhaa ja yhä normaalisti käytettävää suomalaista näppäimistöasettelua käytettäessä sillä voidaan kuitenkin kirjoittaa vain sellaisia tarkkeellisia kirjaimia, jotka kuuluvat Latin-1-merkistöön. Esimerkiksi akuutin saaminen c:n päälle (ć) vaatii toisen menettelyn, esimerkiksi laajennetun näppäimistöasettelun (suomalainen monikielinen näppäimistö).