Web-julkaisemisen opas, luku 2 Reseptit: Miten luon Web-sivujen kokonaisuuden, ja muuta vaativampaa:

Merkillisyyksiä: merkit ja niiden koodit

Sisällys

Tämä luku käsittelee erilaisten merkkien (characters) sisällyttämistä Web-sivuille. Mitä laajempaa merkkivalikoimaa tarvitset, sitä vaikeammiksi hommat käyvät.

"Turvalliset" merkit

"Turvallisia" merkkejä datan käsittelyssä ja siirrossa ovat oikeastaan vain Ascii-merkit, ja niistäkin joihinkin liittyy ongelmia eri yhteyksissä.

Seuraava taulukko esittää Ascii-merkistön kirjoittuvat merkit; HTML:n kannalta ongelmalliset merkit ovat korostettuina:

  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~ 

Kyseisiin ongelmallisiin merkkeihin liittyvät seikat ovat ratkaistavissa helposti:

" Voidaan yleensä kirjoittaa sellaisenaan, mutta määritteiden arvoissa (lainausmerkkien sisällä) käytetään merkintää &quot; (esimerkki: title="Jukka &quot;Yucca&quot; Korpela"
& kirjoitetaan &amp; silloin, kun halutaan sisällyttää &-merkki itse dataan (esim. R&amp;D näkyy muodossa R&D)
< kirjoitetaan &lt; silloin, kun halutaan sisällyttää <-merkki itse dataan (esim. a&lt;b näkyy muodossa a<b)
> kirjoitetaan &gt; silloin, kun halutaan sisällyttää >-merkki itse dataan

Sääntöjen syynä on se, että kyseisiä merkkejä käytetään itse HTML-kielen rakenteiden erottamiseen tekstistä. Niinpä tarvitaan jokin keino (ns. escape-mekanismi), jolla niitä tarvittaessa voidaan sisällyttää itse tekstiin.

"Ääkköset" ja muut ISO Latin 1 -merkit

Edellä esitetty Ascii-merkistö ei tietenkään riitä esimerkiksi suomen kielen kirjoittamiseen, vaan tarvitaan lisäksi ä- ja ö-kirjaimet. Nekään eivät käytännössä yleensä tuota ongelmia Suomen oloissa nykyisin; yleensä ne löytyvät suoraan näppäimistöltä tai ovat ainakin kirjoitettavissa jollain näppäintemppuilulla.

Tarvittaessa kuitenkin ä, ö, Ä ja Ö voidaan esittää merkinnöillä &auml;, &ouml;, &Auml; ja &Ouml;. Silloin tosin HTML-dokumenttia on ikävä lukea sitä editoitaessa. Kyseisten merkintöjen käyttö ei tarjoa mitään etua paitsi erikoisissa poikkeustilanteissa, esim. kun dokumentin koodauksena on UTF-8.

Yleisemmin HTML:ssä voidaan suhteellisen turvallisesti käyttää koko ISO Latin 1 -merkistöä. Tämä merkistö on länsi- ja pohjoiseurooppalaisia kieliä varten kehitetty. Tarkemmin siitä kertoo kirjoitukseni ISO-Latin-1-merkistöstä. Seuraavassa on kaikkien ISO Latin 1 -merkkien taulukko, jossa kukin merkki toimii linkkinä merkin yksityiskohtaiseen (englanninkieliseen) kuvaukseen dokumentissa The ISO Latin 1 character repertoire - a description with usage notes:

  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~
  ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
° ± ² ³ ´ µ · ¸ ¹ º » ¼ ½ ¾ ¿
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
à á â ã ä å æ ç è é ê ë ì í î ï
ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

Jos käytät esim. Mac-tietokonetta, niin käytössä oleva merkkikoodi on eri kuin ISO Latin 1. Tästä ei kuitenkaan yleensä aiheudu ongelmia, jos dokumentin siirto Macistä Web-palvelimeen tehdään oikein, esim. FTP:llä tekstimoodissa, jolloin tapahtuu automaattinen merkkikoodimuunnos.

Toisaalta suurelle osalle Maciä käyttävistä lukijoista aiheuttaa ongelmia se, että monet Macissä toimivat selaimet eivät vieläkään osaa näyttää kaikkia ISO Latin 1 -merkkejä. Ongelmalliset merkit ovat: ¦²³¹¼½¾Ð×ÝÞðýþ joista yläindeksit ja kertomerkki lienevät tavallisimmin käytettävät.

ISO Latin 1 -merkkien kirjoittamiseen joudutaan yleensä käyttämään erityisiä ohjelmakohtaisia menetelmiä, koska missään näppäimistössä tuskin on niitä kaikkia. Tyypillisen PC-näppäimistön osalta ks. ohjetta Erikoismerkkien kirjoittaminen suomalaisella PC-näppäimistöllä. Yleisesti aiheesta kertoo A tutorial on character code issues, kohta Typing characters, mutta tässä kerrottakoon yksi hyvin yleisesti käytetty menetelmä: Windows-järjestelmissä lähes kaikissa ohjelmissa (ei kuitenkaan Emacsissa) voi käyttää ns. Alt-0nnn-menetelmää: Paina Alt-näppäin (välilyöntinäppäimen vasemmalla puolella) alas ja, pitäen sitä alhaalla, kirjoita erilliseltä numeronäppäimistöltä (oikealla) merkki 0 (nolla) ja halutun merkin kolminumeroinen desimaalinen koodi nnn. Koodit voit katsoa esim. dokumentista Taulukko ISO-Latin-1:n merkeistä ja niiden nimistä. Vastaavat tiedot ovat monella muullakin Web-sivulla, mutta ole tarkkana: muista käyttää desimaalisia koodeja ja olla käyttämättä koodiarvoja 127 - 159, sillä ne eivät kuulu ISO Latin 1:een. Esimerkiksi espanjan kielessä käytetty ñ-merkki (n-kirjain, jonka päällä on tilde, "aaltoviiva") voidaan Windowsissa kirjoittaa näppäilemällä Alt-0241. Yksi vaihtoehto on kirjoittaa &#241;, mutta silloin sinun on itsesi vaikea lukea, mitä kirjoitat, vaikka se kyllä selaimissa toimii. Lähes yhtä vaikea on lukea "symbolisia" merkintöjä kuten &ntilde;, vaikka ne ovatkin vielä yksi (ja aina käytettävissä oleva, ohjelmasta riippumaton) vaihtoehto.

Seuraavassa tarkasteltavat aksenttinäppäin ja diereesinäppäin
ovat suomalaisen PC-näppäimistön perusosan oikeassa reunassa,
+-näppäimestä oikealle ja å-näppäimestä oikealle.Tyypillisellä Suomessa käytettävällä PC-näppäimistöllä onnistuu aksentillisten kirjainten kuten é kirjoittaminen usein myös näppärällä ja helposti muistettavalla tavalla: käyttäen apuna näppäimistön paria erikoisnäppäintä, joita voi sanoa aksenttinäppäimeksi ja diereesinäppäimeksi. Jos näpäytät ensin aksenttinäppäintä, johon on merkitty akuutti aksentti ´ ja sen yläpuolelle graavi aksentti `, ja sitten vaikkapa e-näppäintä, saat aikaan akuutilla aksentilla varustetun kirjaimen é. Tekemällä samoin mutta shift-näppäin alhaalla silloin, kun näpäytät aksenttinäppäintä, saat aikaan graavilla aksentilla varustetun kirjaimen è. Vastaavasti saat diereesinäppäimellä, jossa on ¨ ja ^, aikaiseksi diereesillä (kahdella pistellä, umlautilla) tai sirkumfleksilla varustettuja merkkejä kuten ü ja û sekä vielä Alt Gr -näppäintä apuna käyttäen tildellä varustettuja merkkejä kuten ñ. Isojen kirjainten aikaansaamiseksi käytetään shift-näppäintä siinä vaiheessa, kun näpäytetään kirjainnäppäintä. Mainittakoon vielä, että µ-kirjain saadaan Alt Gr:n avulla m-näppäimestä. Edellä sanottu koskee siis tyypillistä suomalaista PC-näppäimistöä eikä ole yleispätevä ohje.

Muita suomen kielen kirjoittamisen ongelmia

ISO Latin 1 ei sisällä hattu-s:ää eikä hattu-z:aa, jotka kuuluvat suomen viralliseen kirjoitusjärjestelmään. yleensä on parasta HTML-dokumenteissa toistaiseksi käyttää niiden asemesta merkkipareja sh ja zh. Jos kuitenkin pidät tärkeämpänä sitä, että useat näkevät sivusi niin, että sillä on oikea hattu-s ja hattu-z, kuin sitä, että kaikki voivat lukea sivusi, käytä seuraavia merkintöjä: &#353; (pieni hattu-s), &#352; (iso hattu-s), &#382; (pieni hattu-z) ja &#381; (iso hattu-z). Euron merkkiä ei myöskään kannata käyttää; on paljon turvallisempaa käyttää sanaa "euro" sopivassa taivutusmuodossa kuin sinänsä oikeaa esitysmuotoa &#8364;. Huomaa myös, että ajatusviiva ei kuulu ISO Latin 1:een eikä ole turvallisesti esitettävissä, vaikka se kuuluukin ns. Windows-merkistöön. (Tai oikeammin sanoen siihen kuuluu kaksi erimittaista viivaa, "em dash" ja "en dash".) Sama koskee ns. "oikeita" lainaus- ja heittomerkkejä. On parasta tyytyä toistaiseksi käyttämään yhdysmerkkiä ajatusviivan asemesta sekä "pystysuoraa" (Ascii-merkistön) lainausmerkkiä (") ja heittomerkkiä ('). Ks. kirjoitustani Mikrojen merkistöjen aiheuttamista ongelmista Webissä.

Laajempiin merkkiavaruuksiin

Valitettavasti muiden kuin ISO Latin 1 -merkkien käyttö Webissä aiheuttaa huomattavia ongelmia. Niiden vaikeusaste vaihtelee, ja aloitamme helpoimmista. Ensin kuitenkin yleisiä huomautuksia.

Miten merkeille voi käydä
Hieno esitys Kun menee pieleen
Lech Walesa, alpha Centauri ja nabla F hienosti esitettyinä Lech WaB sa, ± Centauri ja  F

Harkitse, selviäisitkö kuitenkin ISO Latin 1:llä. Yhdenkin sen ulkopuolisen merkin ottaminen mukaan aiheuttaa ongelmia. Olisi kyllä hienoa ja korrektia, jos voisi kirjoittaa esimerkiksi Lech Walesan nimen tarkasti oikein, puhua alfa Centaurista kreikkalaista kirjainta käyttäen ja viitata Laplacen operaattoriin nablamerkillä. Mutta maksaako se vaivan, jos merkittävä osa lukijoista - ehkä jopa enemmistö - näkee hienot merkkisi outoina vänkyröinä, kysymysmerkkeinä, laatikoina tai oikeannäköisinä mutta väärinä merkkeinä? Seuraavassa on edellä mainittuja merkkejä sisältäviä ilmaisuja, jotta voit nähdä, miten sinun selaimesi niistä selviää (ja ohessa on kuvat kahdesta muusta esitysmuodosta): Lech Wałęsa, α Centauri, ∇F.

On tärkeää, miten laajaa merkkivalikoimaa tarvitset. Toinen tärkeä kysymys on, miten olennaiseen käyttöön niitä tarvitset. Jos esimerkiksi jutussasi puhutaan Lech Walesasta, ei ole viestinnän onnistumiselle välttämätöntä, että saat l- ja e-kirjaimeen oikeat lisukkeet. Mutta jos koko juttusi on puolankielinen, tilanne on aivan toinen: tarvitset merkkivalikoiman, jolla puolaa voi kirjoittaa normaalisti. Vastaavasti jos juttusi käyttää yksikköä ohmi, on tuskin välttämätöntä, että voi käyttää oikeaa ohmin tunnusta eli isoa oomegaa (Ω). Jos taas tekstisi vilisee kreikankielisiä sitaatteja taikka matemaattisia erikoissymboleita, joudut yleensä hyväksymään sen, että kaikki eivät voi lukea sitä kunnolla.

Käytännössä keskeistä on, selviätkö jollakin ns. kahdeksanbittisellä merkistöllä. Sellaisessa merkistössä on periaatteessa 256 merkkipaikkaa, joista käytännössä yleensä puolet on kaikissa merkistöissä samoja, nimittäin Ascii-merkit. Loppuosastakin useat positiot on varattu kontrollikoodeille, joten käytännössä vaihtoehtoja on vain noin 100 merkin osalta. Esimerkiksi

Joka tapauksessa joudut huolehtimaan merkkien koodausta koskevan informaation lähettämisestä selaimelle. Esimerkiksi ISO 8859-2 -koodatussa tekstissä mikään itse tekstissä ei kerro koodausta, siis siitä, miten mikin data-alkio pitää tulkita. Periaatteessa sama ongelma on ISO Latin 1:n kanssa, mutta käytännössä ISO Latin 1 on varsin pitkälle oletusarvo selaimissa.

Kyseinen informaatio tulisi Web-palvelimen lähettää selaimelle. Tapa, jolla asia hoidetaan, on palvelinkohtainen. Ks. yleisiä ohjeita asiasta pienoisoppaassa Laajennetun merkistön käyttö HTML:ssä.

"Keskieurooppalaiset", kyrilliset, kreikkalaiset ym. merkit

"Keskieurooppalainen" merkistö ISO 8859-2

Aloitamme ehkä helpoimmasta tapauksesta: edellä mainitusta ISO 8859-2:sta. Miten voisimme kirjoittaa esimerkiksi puolankielisen HTML-dokumentin? Unohdetaan tässä kielivaikeudet ja keskitytään merkistöongelmiin. Puolan merkistössä tarvitaan meille tuttujen kirjainten ohella eräitä merkkejä, joissa tavalliseen kirjaimeen on liitetty lisuke kuten poikkiviiva.

Käsittelemme ensin erästä tapaa, joka on ehkä enemmänkin eräitä periaatteita valaiseva kuin käytännöllinen. Voisimme menetellä niin, että kirjoitamme dokumentin muutoin aivan tavalliseen tapaan mutta käyttäen vain Ascii-merkkejä sekä ä:tä ja ö:tä, ja puolassa tarvittavat kirjaimet otamme ISO 8859-2:sta siten, että katsomme vertailutaulukosta, mitkä ovat koodinumeroiltaan vastaavat merkit ISO Latin 1:ssä. Esimerkiksi l-kirjainta, jossa on poikkiviiva, vastaa tässä mielessä yläindeksi ³ ja e-kirjainta, jossa on koukku alhaalla, vastaa e, jossa on sirkumfleksi (ê). Nyt sitten vain kirjoitamme nuo merkit jollakin edellä kuvatuista tavoista; näin kirjoitettuna esimerkiksi Walesa-nimestä tulee Wa³êsa. Tämähän ei hyvältä näytä, mutta jos palvelin pannaankin ilmoittamaan koodaukseksi ISO 8859-2 ja selain tämän ymmärtää ja sillä vielä on sopiva fontti käytössään, niin hommahan pelaa (ei aina, koska selaimissa on vielä puutteita, mutta jo useimmiten).

Tämä voi kuulostaa huijaukselta ja sekoilulta, mutta merkkikoodiasioiden perusteiden pohjalta sen ehkä voi ymmärtää ja samalla se kenties havainnollistaa koodiasioita: se, miltä tiedosto näyttää esimerkiksi editorissa, riippuu täysin siitä, minkälaisen koodauksen mukaisesti ohjelma tulkitsee tiedoston sisällön merkeiksi. Ja joka tapauksessa ISO 8859-2 sopii hyvin moniin tarkoituksiin. Luonnollisestikin on parempi, jos voi käyttää sellaista editoria, joka suoraan näyttää merkit oikein.

Hankala kysymys on, pitäisikö dokumenttiin kirjoittaa myös meta-elementti, joka ilmoittaa koodauksen, esim.
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
Periaatteellisesti se on epälooginen, münchhausenmainen ratkaisu - dokumentti yrittää kertoa oman koodauksensa, ja tämän se tietysti tekee tekstillä, mutta miten tekstiä voi lainkaan tulkita tietämättä koodausta? Käytännössä se voi aiheuttaa ongelmia. Mutta tässä yhteydessä olen noita meta-elementtejä käyttänyt. Syynä on lähinnä se, että muutoin paikalliset kopiot dokumenteista eivät toimi oikein. Jos lukija on imuroinut aineiston omaan koneeseensa ja lueskelee sitä siellä, niin tietenkään mikään palvelin ei ole lähettämässä informaatiota koodauksesta!

ISO 8859-2:ta käsittelee laaja sivusto, joka nimestään Latin 2 Fonts huolimatta käsittelee monia muitakin asioita kuin fontteja (kirjasintyyppejä), mm. näppäimistö- ja ohjelmistoasioita.

Huomaa, että edellä ei ole puhuttu mitään fonteista. Eikä ole syytäkään. Toki on hyvä, jos sivun tekijällä on käytössään fontti, jonka ansiosta hän näkee merkit oikein. Mutta kuten esimerkki osoitti, se ei periaatteessa ole välttämätöntä. Lukija tarvitsee koneeseensa jonkin fontin, jossa on tarvittavat merkit. Mutta itse HTML-dokumentissa ei tarvitse eikä yleensä ole syytäkään sanoa mitään fonteista.

Kyrilliset, kreikkalaiset yms. merkit

Yleisempi ratkaisu on käyttää jotakin sopivaa ohjelmistoa, joka helpottaa kirjoittamista ja jolla voidaan kirjoittaa useita eri kieliä. Ks. Alan Woodin koostetta Unicode and Multilingual Editors and Word Processors. Tässä mainitaan vain eräs vaihtoehto Windows-koneisiin: UniPad, joka on laajaa merkkivalikoimaa tukeva tekstieditori. Apuohjelmana voi käyttää Free recodea, joka on yleisohjelma merkkikoodien välisiin muunnoksiin.

Täten voisi esimerkiksi kirjoittaa UniPadillä dokumentin, jossa on suomea ja venäjää, tallentaa sen UTF-8-muodossa kyseisestä ohjelmasta ja muuntaa Free recodella esimerkiksi koi8-r-muodoon, joka lienee venäjänkielisten sivujen tavallisin koodaus. Muunnos tapahtuisi (komentoikkunassa) seuraavaan tapaan:
cp test.utf test.koi
recode utf-8..koi8-r test.koi
Palvelimeen voidaan sitten siirtää haluttaessa molemmat versiot (test.utf ja test.koi) ja tarvittaessa nimetä ne sopivalla tavalla. Palvelinkohtaisilla järjestelyillä on sitten hoidettava, että palvelin lähettää oikean informaation koodauksesta. Seuraavat linkit viittaavat demosivuun kahtena eri versiona: UTF-8-testisivu ja KOI8-R-testisivu. Nämä sitten saattavat toimia selaimessasi tai olla toimimatta.

Tässä tapauksessa dokumentteihin on vielä "käsin" lisätty meta-tägit, jotka ilmoittavat koodauksen. Kuten edellä mainittiin, sellainen ei yleensä ole aiheellista. Tämä esimerkki havainnollistaa osaltaan, miksi näin on. Jos dokumentin koodausta muutetaan, niin myös sellaiset meta-tägit pitäisi muuttaa, mutta tätä taas merkkikoodinmuunnosohjelmat eivät suinkaan tee - niiden tehtävähän on operoida koodauksen tasolla, oli data millaista tahansa, eivätkä ne esim. tunnista HTML-merkkausta.

UniPadistä voidaan myös suoraan tallentaa esim. koi8-r-koodattuna, kunhan käytetään sen Export-valikkoa. Edellä oleva menettely oli siis turhan mutkikas yksinkertaisiin tilanteisiin mutta toisaalta havainnollistaa sitä, että ei ole kovinkaan vaikeaa tehdä sivusta versioita, joissa on eri koodaus. Sellainen vaihtoehtoisuus voi olla eduksi, koska osalle lukijoista sopii teknisten syiden takia yksi koodaus, osalle toinen.

Kreikan kirjoittamiseen voidaan käyttää nykykreikan osalta koodausta ISO 8859-7 tai windows-1253, joiden ero on suhteellisen pieni. Ns. polytoninen kreikka, jossa on useita erilaisia painomerkkejä, vaatiikin sitten jo käytännössä Unicoden käyttöä (ja lisäksi lukijoiden todennäköisesti pitää jostain löytää sopiva fontti).

Matemaattiset merkit - ja lausekkeet

Matemaattisten merkkien käyttö, matemaattisista lausekkeista puhumattakaan, on varsin ongelmallista HTML:ssä. Edellä kuvattu ISO Latin 1 sisältää vain muutaman matemaattisen merkin. Merkkivalikoiman laajentaminen on mahdollista seuraavassa kohdassa kuvattavalla tavalla, joskin silloin lisääntyy niiden lukijoiden määrä, jotka eivät näe sivua oikein. Vielä ongelmallisempaa on, että varsinaisia kaavoja ja lausekkeita varten HTML:ssä ei ole merkkausta.

Niinpä yleensä käytetään sellaista menettelyä, että kaavat tuotetaan kuvamuotoon esim. TeX-ohjelmistolla ja upotetaan HTML-dokumenttiin img-elementillä. Menettelyä käytetään mm. CSC:n opasaineistossa sekä laajassa MathWorld-tietosanakirjassa.

Jossain määrin, melko yksinkertaisissa tapauksissa, on kuitenkin mahdollista käyttää HTML:ää matemaattisten kaavojen esittämiseen. Ks. Math in HTML (and CSS). Tässä vain pikku esimerkki (joka ei välttämättä toimi selaimellasi):

(a²+b²)

"Täydellinen" merkkivalikoima (UCS)

Periaatteessa HTML:ssä voi käyttää koko Unicode-merkistöä, tai vieläkin periaatteellisemmin sanoen vieläkin laajempaa merkistöä (Universal Character Set, UCS). Vaihtoehtoja on olennaisesti kaksi:

Näitäkin asioita on selostettu hiukan tarkemmin edellä mainitussa ohjeessa Laajennetun merkistön käyttö HTML:ssä. Suomeksi merkistöasioiden keskeisiä kysymyksiä käsittelee myös Markku Immosen esitys merkistöistä Webissä.