Terminaali ja UTF-8

VAROITUS

Jos eri osien (Putty/terminaali, Screen, Irssi, yms.) merkistöasetukset eivät vastaa toisiaan, skandit eivät toimi oikein. Tämä on olennaista, kun lähdet muuttamaan asetuksia 8-bittistä merkistöä käyttävästä järjestelmästä UTF-8:an, koska ensimmäiset muutokset näyttävät rikkovan skandit, ja teksti alkaa näkyä vasta, kun jokainen ketjun osa on merkistöstä keskenään samaa mieltä. Linux-koneilla ohjelmat yleensä osaavat noudattaa locale-asetusta. Jos otat SSH-yhteyksiä, olisi localekin hyvä muuttaa yhteyden kummassakin päässä (pakollista tämä ei kuitenkaan ole). Tärkeintä on kuitenkin, ettet vaihda jonkin osan merkistöasetuksia takaisinpäin, koska ne näyttivät vievän tilannetta huonommaksi. Pienen vaivan jälkeen käytössäsi kuitenkin on täysin toimiva ja ennen kaikkea merkistöongelmaton järjestelmä.

Merkistön vaikutus

Seuraavassa pieni esimerkki siitä miten pari UTF-8:a sisältävää testiriviä näkyvät terminaalillasi merkistöstä riippuen, kun Irssi tekee merkistömuunnoksen terminaalimerkistöllesi:

Terminaali UTF-8:

23:04 <@Tronic> Šakki, €uro ja Ääkkönen
23:04 * Tronic ♥ UTF-8

Terminaali ISO-8859-15 tai CP1252:

23:04 <@Tronic> Šakki, €uro ja Ääkkönen
23:04 * Tronic ? UTF-8

Terminaali ISO-8859-1:

23:04 <@Tronic> ?akki, EURuro ja Ääkkönen
23:04 * Tronic ? UTF-8

Ylläolevat esimerkitkin (erityisesti sydän) saattavat näkyä väärin mikäli webbiselaimesi ei tunne tarvittavia fontteja tai muuten ei pysty Unicodea käyttämään täysipainoisesti. Graafisten selainten kanssa ei ongelmia yleensä esiinny.

Jotta kaikki merkit saataisiin näkyviin, tulisi terminaalinkin siis käyttää UTF-8:a. Tämä hoituu vaihtamalla käyttöön UTF-8-locale, jolloin useimmat terminaalit, screen ja irssi vaihtavat merkistöä. Jos otat ssh-yhteyden toiselta koneelta, kannattaa huomata että kukin ohjelma noudattaa sen koneen localea jolla ohjelmaa ajetaan. Tästä syystä locale kannattaisi vaihtaa molemmilta koneilta. Jos yhteys otetaan Windows-koneelta, täytyy siellä pyörivä ssh-clientti säätää käsipelillä käyttämään UTF-8:a (ks. Puttyn ohje alempana).

Merkistötesti

Jos on terminaalinsa merkistöstä epävarma, voi sitä testata komennolla echo ä | hexdump -C, joka pitäisi saada kirjoitettua sokkona ja ilman virheitä. Komento siis saattaa näkyä ruudulla väärin ja backspacen käyttö kirjoitusvirheiden korjaamiseen voi myöskin sotkea tulokset. Komento pitää luonnollisestikin kirjoittaa käsin, eikä pasteta tai hakea command historysta.

Terminaali käyttää UTF-8:a:

00000000  c3 a4 0a                                          |...|

Terminaali käyttää jotakin legacy-merkistöä (ISO-8859-1, ISO-8859-15, CP1252, ..):

00000000  e4 0a                                             |..|

Terminaali on säädetty väärin ja käyttää “kaksinkertaista” UTF-8:a:

00000000  c3 83 c2 a4 0a                                    |.....|

Näistä viimeisen saa aikaiseksi silloin jos terminaali on säädetty UTF-8:lle, mutta välissä on screen, joka luulee terminaalin olevan legacy-merkistöllä. Tämän voi todeta myös ajamalla saman testin screenin ulkopuolella (jolloin tuloksena pitäisi olla UTF-8) ja screenin sisällä (jolloin siis kaksinkertainen UTF-8). Asia korjaantuu säätämällä screen oikein (Ctrl+A, kaksoispiste, jolloin ruudun alalaitaan tulee komentorivi, johon annetaan komento utf8 on on). Jos localet on säädetty oikein, ei tällaisia ongelmia kuitenkaan pitäisi esiintyä lainkaan.

Jotta sinun ei tarvitsisi jatkuvasti suorittaa em. Ctrl-A -alkuista näppäilyä, voit lisätä tämän rivin tiedostoon ~/.screenrc :

utf8 on on

Myös tämä voi olla hyvä lisätä:

defutf8 on

Locale-asetusten vaihtaminen

Linuxilla (kuten muillakin UNIX-varianteilla) ohjelmat tottelevat maa-asetuksia, joita kutsutaan localeiksi. Näillä voidaan määritellä ohjelmien käyttämä kieli, desimaalierottimet ja lukuisia muita asioita - myös merkistö.

Mikä locale on oikea?

Kuten todettua, locale määrittelee myös ohjelmien käyttämän kielen. Siksi asetus fi_FI.utf8 saattaa merkistön lisäksi vaihtaa osan ohjelmista suomenkielisiksi. Mikäli suomi ei miellytä, en_GB.utf8 tai en_US.utf8 ovat vaihtoehtoja.

Listan tuetuista localeista saa yleensä komennolla locale -a. Monet ohjelmat antavat virheilmoituksia, eivätkä tunnista merkistöä oikein, mikäli valittua localea ei ole käyttöjärjestelmässäsi. Voit tarkistaa tilanteen komennolla locale. POSIX tarkoittaa ettei localea ole (onnistuneesti) asetettu. Komento listaa myös muut locale-asetukset kuin merkistön säätöön käytetyn LC_CTYPE-kentän. Yleisimmät asetukset ovat seuraavat:

  • LANG: Oletusarvo, jota käytetään, jos yksittäistä tarkempaa muuttujaa ei ole asetettu.
  • LC_ALL: Kaikki muut asetukset kumoava yleisasetus.
  • LC_CTYPE: Kertoo, mitkä merkit tulkitaan kirjaimiksi jne. Tämä pitää vähintään asettaa, jos haluaa suomen toimivan, mutta pitää käyttöliittymän englannin kielisenä.
  • LC_COLLATE: Aakkostusjärjestys. Tämä muuttaa esim. ls -a:n järjestyksen.
  • LC_NUMERIC: Desimaalipilkku tai piste jne.
  • LC_MESSAGES: Tällä vaihtuu ohjelmien käyttöliittymän kieli.
  • LC_TIME: Päivämäärän ja kellonajan esittäminen. Muuttaminen voi sotkea joitain skriptejä.

Tyypillisesti Linux-järjestelmissä on muitakin asetuksia (LC_PAPER, LC_IDENTIFICATION jne.), mutta nämä eivät ole kovin yleisesti käytössä.

Tavallisesti ohjelmat päättelevät UTF-8:n käytön LC_CTYPE-asetuksesta, tai jos sitä ei ole asetettu LANG asetuksesta. Suositeltavaa on asettaa molempiin joku UTF-8, asetus, esim. LANG=en_US.utf8 ja LC_CTYPE=fi_FI.utf8.

Seuraavissa esimerkeissä oletetaan että valitsit fi_FI.utf8:n. Mikäli päädyit johonkin muuhun niin kirjoita tilalle vain oma valintasi.

Koko kone kerralla

Jos sinulla on root-oikat koneelle, on helpointa muuttaa koko koneen locale kerralla mieleiseksi, jolloin (rebootin jälkeen) kaikki softa käyttää uutta localea ja oikeaa merkistöä ilman muita säätöjä. Valitettavasti tämä tehdään kaikissa distroissa eri tavalla.

Gentoo

Tee tiedosto /etc/env.d/02locale, johon kirjoitat rivin LC_CTYPE=fi_FI.utf8. Muista tiedoston tallentamisen jälkeen ajaa komento env-update, jotta Gentoo lukee tekemäsi muutokset.

Slackware ja Tukaani

Muuta tiedostosta /etc/profile.d/lang.sh:

#export LANG=en_US
...
export LANG=en_US.UTF-8

Mikäli käytät C-shelliä, tee vastaavat muutokset tiedostoon /etc/profile.d/lang.csh.

Debian

Localet vaihdetaan komennolla

dpkg-reconfigure locales

Valitse listalta (rasti ruutuun) jokin .UTF-8-locale ja seuraavassa valikossa valitse se järjestelmän oletuslocaleksi. Yksityiskohtaisempia muutoksia voi tehdä muokkaamalla tiedostoa /etc/default/locale .

Ubuntu

Muuta tiedostoa /etc/environment, ja lisää tai muuta riviä: LC_CTYPE=fi_FI.utf8 tai LANG=fi_FI.utf8.

Käyttäjäkohtaiset asetukset

Toinen vaihtoehto on tehdä säädöt paikallisemmin. Localen voi asettaa shellin käynnistysscriptissä, jolloin asetus vaikuttaa shellissä käynnistettyihin ohjelmiin, mutta ei muualle. Tämä vaihtoehto on erityisen hyvä jos käytät konetta vain SSH-yhteyden yli (eikä sinulla ole root-oikeuksia).

Jos taasen käytät X:ää, jossa on graafinen login, ei shellisäätö suoraan vaikuta terminaaleihin (esim. xterm tai Konsole). Jotkin graafiset loginit (gdm ja kdm) sallivat localen valitsemisen valikoista (Options) ennen sisäänkirjautumista. X:n startx-komennolla käynnistävät puolestaan saavat localeasetuksensa shellistä, jossa startx-komento ajetaan - jolloin shelliasetus siis todellakin vaikuttaa myös X:ään. Kannattaa huomata että X:n käytössä oleva locale vaikuttaa kaikkiin sen sisällä ajettaviin ohjelmiin, myös shelleihin, mutta ei SSH:n yli muille koneille.

Windows-terminaalit eivät käytä localea, vaan niihin määritellään suoraan käytettävä merkistö. Gnome Terminal antaa myös valita localesta poikkeavan merkistön valikosta ja muilla terminaaleilla merkistöasetuksiin voi yleensä vaikuttaa komentoriviparametreilla, joten localen asettaminen oikein ei ole terminaalin kannalta aivan välttämätöntä.

Localen asetus shellin käynnistysscriptissä

Lisää ~/.bash_profile:en rivi export LC_CTYPE=fi_FI.utf8, tai csh/tcsh:lla setenv LC_CTYPE fi_FI.utf8 ~/.cshrc:hen. Muiden shellien käyttäjät löytänevät vastaavat tiedostot. ksh:ssa (ja sen klooneissa pdksh ja mksh) ja zsh:ssa ympäristömuuttuja voidaan asettaa samanlaisella syntaksilla kuin bashissakin. zsh:n tapauksessa suositeltava asetustiedosto on ~/.zshenv . ksh:n tapauksessa suositeltava tiedosto on ~/.profile .

PuTTY

Windowsilla toimiva PuTTY ei luonnollisestikaan locale-asetuksia noudata, vaan merkistö vaihdetaan valitsemalla alkuvalikosta Window → Translation ja sieltä listasta UTF-8. Asetukset kannattaa tallentaa oletuksiksi Session-sivulta (tallenna asetukset tyhjällä nimellä). Tämä siis locale-asetusten lisäksi (PuTTY ei voi asettaa kohdekoneen shellin merkistöasetuksia).

PuTTY ja vanhemmat Windowsit

Windowsin vanhemmissa versioissa, kuten Windows98:ssa em. PuTTY:n asetukset eivät auta, koska niissä on huono Unicode-tuki. Silloin voidaan käyttää merkistökonversioita screen-ohjelmassa siellä Unix-koneessa, jonne PuTTY:llä on otettu yhteys.

Kokeiltu tapa

PuTTY:ssä täytyy valita kohdassa ”Translation” Codepage nimeltä ”Win1252 (Western)”. Ehkä joku ISO-LATIN-1 eli ISO-8859-1 toimisi myös. Sitten kun kirjautuu sisään johonkin Unixiin, jossa on UTF-8:aa käyttävät localet päällä, täytyy käynnistää screen. Sitten täytyy screen:issä näppäillä näin: ”Ctrl-a :utf8 on off”. Tällöin screen konvertoi ruudulle tulostuvat UTF-8-merkit 8-bittisiksi ja 8-bittisinä näppäiltävät merkit konvertoituvat UTF-8:ksi kulkiessaan screen:in läpi sen alaisuudessa pyörivälle ohjelmalle.

Voit käyttää Unicoden merkeistä vain sitä osajoukkoa, jonka merkit löytyvät käyttämästäsi 8-bittisestä merkistöstä. Varminta on käyttää kirjainten A–Z ja a–z lisäksi vain skandeja, numeroita ja yleisimpiä välimerkkejä. Lainausmerkkeinä on käytettävä merkkejä ” ja ' . Jos palattuasi Unicodea hyvin tukevaan ympäristöön screen näyttää merkit väärin, näppäile: ”Ctrl-a :utf8 on on”.

Kokeilematon tapa

PuTTY:ssä täytyy valita kohdassa ”Translation” Codepage nimeltä ”ISO-8859-15”. Sitten kun kirjautuu sisään johonkin Unixiin, jossa on UTF-8:aa käyttävät localet päällä, täytyy käynnistää screen ilman optiota ”-U”. Näppäile screenissä näin jokaisessa käyttämässi screenin ikkunassa: ”Ctrl-a : encoding UTF-8 ISO8859-15” ja ”Ctrl-a :utf8 on off”. Tämän jälkeen voit näppäillä täysin vapaasti kaikkia ISO-8859-15-merkistön sisältämiä merkkejä ja ne konvertoidaan UTF-8-merkistöön ennenkuin ne menevät screenin alla pyörivälle ohjelmalle. Vastavasti jokainen screenin alla pyörivän ohjelman tulostama merkki konvertoidaan UTF-8:sta ISO-8859-15 -merkistöön ennen ruudulle tulostamista. Jos aiot käynnistellä uusia ikkunoita screenissä näppäilyllä ”Ctrl-a c”, sinun kannattaa ennen sitä näppäillä yhden kerran näin: ”Ctrl-a : defcharset ISO-8859-15”

Jos palattuasi Unicodea hyvin tukevaan ympäristöön screen näyttää merkit väärin, näppäile jokaisessa screenin ikkunassa: ”Ctrl-a :utf8 on on” ja ”Ctrl-a : encoding UTF-8 UTF-8”. Jos avaamissasi uusissakin screenin ikkunoissa ei UTF-8-merkistö toimi, näppäile myös näin: ”Ctrl-a : defcharset UTF-8”

Terminal.app

Tarkista, että asetukset ovat seuraavat:

  • “Terminal”-valikko

"Terminal"-valikko

  • “Window settings…” -valinta

"Window settings..." -valinta

  • “Emulation” → “Escape non-ASCII characters”: ruksi pois

"Emulation" → "Escape non-ASCII characters": ruksi pois

  • “Display” → “Character Set Encoding: Unicode (UTF-8)” ja “Use Settings as Defaults”

"Display" → "Character Set Encoding: Unicode (UTF-8)" ja "Use Settings as Defaults"

Unicode-fontteja

Terminaaleissa ja terminaaliemulattoreissa tarvitaan tasavälistä fonttia. Graafisissa IRC-klienteissä vaihtuvavälinenkin fontti toimii, mutta jos rivin alussa on aikaleima, sen leveys saattaa vaihdella ouhosti. Varsin kattava kokoelma Unicode-fontteja löytyy yleensä vakionakin, mutta jos pitää jostain tietystä fontista tai haluaa vieläkin enemmän merkkejä niin seuraavassa hyödyllisiä linkkejä:

Linkit

 
terminaali_ja_utf-8.txt · Last modified: 2010/03/05 01:30 by 91.156.173.244
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki