De Help Desk punt NL
Kennisbank
De Helpdesk > De Helpdesk > Kennisbank

Internationalisering

Oplossing

Karaktersets en encoderingen

Voor ons alfabet zijn acht bits meer dan voldoende om alle mogelijke letters te encoderen. Daarmee heb je 256 mogelijkheden. Plaats genoeg voor alle hoofd- en kleine letters. De meest weidverspreide encodering is US-ASCII. ASCII is een standaard waarin maar zeven bits gebruikt worden per karakter. Er zijn wel karaktersets waarbij alle acht bits gebruikt worden die zijn gebaseerd op ASCII.

Er zijn veel talen die niet genoeg hebben aan deze karakters (kleine- en hoofdletters en een paar speciale karakters). Duits en Frans hebben bijvoorbeeld letters met accenten nodig en Nederlands ook in mindere mate. De meest gebruikte standaard is ISO-8859-1, ook wel (ISO) Latin-1 genoemd. Is het achtste bit 0, dan komt het overeen met ASCII. Is deze bit gezet, dan krijg je nieuw toegevoegde symbolen. Deze standaard is bruikbaar voor veel Europese talen. Daarnaast zijn er nog wat meer 8859-varianten waaronder 8859-2 (Latin-2) voor Centraal- en Oost-Europa, 8859-5 voor Cyrillische talen, 8859-7 voor Grieks en 8859-15 (of Latin-9), wat bijna gelijk is aan Latin-1, met als voornaamste verandering dat het universeel valutasymbool vervangen is door een eurosymbool.

Unicode (http://www.unicode.org) is een heel erg leuk idee: verzin een nummer voor elk karakter dat in elke taal op deze aardbol voorkomt. Nou ja, de meest talen dan. Er zijn vele praktische problemen om dit voor elkaar te krijgen. Er wordt nog altijd gesleuteld aan Unicode. Toch is het al meer dan goed bruikbaar. Een veel gebruikte encodering voor Unicode (een manier om de nummers in een bitreeks weer te geven) is UTF-8. Er zijn er nog enkele meer.

Alhoewel Unicode een erg leuk idee is, is het gebruik nog niet erg wijdverspreid. Veelal worden nog lokale oplossingen gebruikt, zodat er in de computerwereld vele encoderingen door elkaar gebruikt worden. Unicode zal waarschijnlijk wel de toekomst worden. Het is dé ultieme manier om tekst in een digitale vorm te zetten. Het biedt ook de mogelijkheid om binnen een tekst karakters uit allerlei talen tegelijk op te nemen. Het hebben van vele verschillende standaarden is een crime. Maar zolang men nog allemaal eigen encodering gebruikt, is er voor goede internationalisering nog altijd een uitgebreide ondersteuning voor allerlei encoderingen nodig. Dat heeft Linux dan ook.

Locales

Linux gebruikt locales. De locale geeft twee dingen aan: de taal en de karakterset. Door middel van een aantal shell-variabelen kun je de gewenste taal en karakterset kiezen.

Er zijn verschillende locale-onderdelen, waaronder LC_CTYPE, LC_TIME, LC_MONETARY, LC_MESSAGES en LC_ALL. LC_CTYPE geeft de te gebruiken karakterset aan, LC_TIME en LC_MONETARY geven aan welke locale gebruikt moet worden voor het weergeven van de tijd en geldbedragen. LC_MESSAGES geeft aan in welke locale berichten van programma's weergegeven moeten worden. Als je de variabele LC_MESSAGES op nl_NL zet, worden alle berichten, indien beschikbaar, in het Nederlands weergegeven. De output van ls is dan bijv. ineens Nederlands geworden. Door de locale-onderdelen apart te zetten, kun je kiezen in welk formaat je munteenheden, adressen, de tijd etc. wilt hebben. Met LC_ALL kun je alle onderdelen tegelijk zetten. Daarmee overrule je alle andere locale-onderdelen.

Tik locale om de huidige waarde van alle onderdelen te bekijken. Je kunt een bepaald onderdeel (in Bash) op een gewenste locale zetten met een commando als export LC_CTYPE=nl_NL@euro.

Verder heb je nog de variabelen LANG en LANGUAGE. Oorspronkelijk was er alleen LANG. LANGUAGE is toegevoegd bij de GNU-software. Wat de meeste software voor Linux gebruikt voor berichten in verschillende talen is de functie gettext (meer hierover verderop). Voor die software geldt de volgende volgorde van prioriteit voor de locale-variabelen: LANGUAGE, LC_ALL, LC_xxx, LANG. Enkele progamma's gebruiken echter geen gettext. Een voorbeeld is OpenOffice.org. Die kijkt alleen naar LANG. Om de locale globaal voor alle software in te stellen is het daarom het beste zowel LANG als LANGUAGE op de gewenste locale te zetten.

Met LANGUAGE kun je meer dan één locale aangeven. Het kan zijn dat er niet voor elk programma tekst beschikbaar is in de door jou gekozen locale. Maar misschien vind je naast Nederlands Frans ook acceptabel. Je kunt dan een voorkeursvolgorde opgeven: export LANGUAGE=nl_NL:fr_FR. Scheid de mogelijkheden steeds met een dubbele punt. Dit kun je niet doen met LANG.

Een programma draait altijd in een bepaalde omgeving van variabelen. Als je zojuist een locale-onderdeel op een andere waarde hebt gezet in een terminal in X, dan heeft dat alleen effect op programma's die in diezelfde terminal worden gestart! (Die programma's worden dan kindprocessen van de shell.) Neem export-regels op in ~/.bashrc om het elke keer te laten zetten bij het starten van Bash. Als je wilt dat het voor alle programma's die je via je window manager of desktopomgeving (zoals KDE en GNOME) start geldt, dan zal X zelf met de juiste omgevingsvariablen zijn gestart. Log je grafisch in met een display manager, dan kun je de taal daar vaak mee kiezen.

KDE heeft voor KDE-software zelf de mogelijkheid in het Control Center de gewenste taal te kiezen.

Wat zijn nou interessante locales? Voor de meeste Nederlanders deze:

  • en_US (gebruikt ISO-8859-1)
  • en_US.utf8 (gebruikt UTF-8)
  • nl_NL (gebruikt ISO-8859-1)
  • nl_NL@euro (gebruikt ISO-8859-15)

FIXME: Hoeven niet zo gedefinieerd te zijn.

Alle locales hebben het formaat taal_REGIO en optioneel .encodering of @modifier. Een overzicht van alle locales is op te vragen met locale -a. Je kunt locales toevoegen met localdef. Om bijv. en_US.utf8 toe te voegen gebruik je localdef -f UTF-8 -i en_US en_US.utf8. Je distributie kan ook een mechanisme hebben om de gewenste locales uit te kiezen.

Het systeem dat onder Linux wordt gebruikt om alle tekst van een programma in verschillende talen te kunnen aanbieden (afhankelijk van de gekozen locale), is gettext. De tekst wordt per taal in een apart bestand gezet: een po-bestand. Over het algemeen is de tekst sowieso in het Engels aanwezig. In de po-bestanden staan eventueel vertalingen (een taal per bestand). Iemand anders naast de programmeur zelf, die vaak niet elke taal op deze aardbol beheerst, kan deze bestanden aanmaken of aanvullen. Is een bepaalde tekst nog niet helemaal vertaald, maar het meeste wel, dan worden de niet vertaalde regels in het Engels weergegeven. Dat zorgt er dus niet voor dat er tekst ontbreekt. Als de po-bestanden af zijn, maakt men er eerst nog een snel te doorzoeken mo-bestand van (een binair formaat, niet meer zomaar te bekijken in een teksteditor).

Alle modernere programma's die GTK+ (GNOME-software) of Qt (KDE-software) gebruiken ondersteunen dankzij deze library's allemaal gettext/locales. Indien de benodigde fonts zijn geïnstaleerd, kan deze software tekst in allerlei talen weergeven. GTK+ maakt hiervoor gebruik van Pango. Veel software van GNOME en KDE is dankzij het werk van vele vrijwilligers wereldwijd beschikbaar is zeer veel verschillende talen.

Andere software waar goede ondersteuning voor allerlei talen en encoderingen nodig is, zijn browsers zoals Firefox. Anders dan bij de meeste software zorgt het zetten van een locale bij een browser alleen voor de taal en encodering van de menu's. De encodering van een bepaalde website hoort aangegeven te zijn in de HTML-code en wordt ook doorgegeven door de webserver die het document aanbiedt. Als dit niet goed geregeld is, kan het zijn dat de browser de tekst niet goed weergeeft. Je moet de encodering dan handmatig kiezen in een menu van de browser.

Iconv

Er zijn conversietabellen voor alle bekende encoderingen. Alle software kan deze mogelijkheid gebruiken om tekst voor het programma te converteren naar de door de gebruiker gewenste encodering (aangegeven door de locale-variabelen). Er is een zeer handig tooltje om conversies handmatig uit te voeren: iconv. Tik iconv --list voor een lijst met bekende encoderingen. Gebruik bijvoorbeeld iconv -f sjis -t euc-jp < foo > foo2 voor het omzetten van het bestand foo in shift-JIS naar EUC-JP. De output komt in het bestand foo2 terecht.

Xmodmap

Met xmodmap kunnen toetsencombinaties worden gedefinieerd om speciale karakters te vormen. Het werkt voor alle software onder X.

In onderstaand voorbeeld worden twee waardes toegekend aan elke toets, namelijk een symbool voor het indrukken van de toets zonder shift en een waarde voor het indrukken van de toets met shift. Elke toets heeft een nummer, een keycode. Zo is de keycode van de /-toets (op het numerieke pad) 0×70. Het symbool / heet ook wel „KP_Divide”. Dat is het symbool dat je krijg je als je de toets zonder shift indrukt (wordt het eerste genoemd). Als je de toets met shift indrukt krijg je het symbool dat „dead_acute” heet. Er wordt dan niets getoond, maar als je erna een klinker intikt, komt daar er een accent aigu (streepje naar rechts) op te staan. (Acute accent is de Engelse benaming voor het streepje naar rechts.) In het volgende voorbeeld worden accenten toegekend aan de toetsencombinaties shift en /, shift en *, shift en - en shift en +.

Maak, als het nog niet bestaat, een bestand genaamd .xmodmap aan in je home directory en zet daar het volgende in.

keycode 0x70 =  KP_Divide   dead_acute
keycode 0x3F =  KP_Multiply dead_diaeresis
keycode 0x52 =  KP_Subtract dead_grave
keycode 0x56 =  KP_Add      dead_circumflex

Voer daarna xmodmap ~/.xmodmap uit. Tijdelijke veranderingen kun je ook sneller laten uitvoeren met:

modmap -e "keycode xx = xxx"

Het is mogelijk om meer dan twee waardes aan een toets toe te kennen. Niet alleen in combinatie met shift, maar ook in combinatie met bijv. een Windows-toets (als je een toetsenbord hebt waar die op zit). In dat geval moet je zorgen dat zo'n toets een modifier is. De toetscode van de linker Windows-toets is 0×73. Om die als modifier te kunnen gebruiken, heb je de volgende twee regels nodig.

keycode 0x73 =  Mode_switch  
add     Mod3 =  Mode_switch

Nu kun je bijv. de e zo gebruiken dat het normaal een e geeft, met shift een E, met de linker Windows-toets een é en met shift en de linker Windows-toets een É. Dat kan met de volgende regel voor xmodmap.

keycode 0x1A =  e   E   eacute  Eacute 

Nog een andere mogelijkheid is gebruikmaken van de multikey, ook wel compose key genoemd. Als je die multikey indrukt, dan een apostrof en daarna een e dan krijg je é. Multikey gevolgd door een dakje (shift en 6) en dan e geeft ê. De volgende regel zorgt ervoor dat de rechter Windows-toets gebruikt wordt als multikey.

keycode 0x74 =  Multi_key 

Je kunt de huidige instellingen bekijken met xmodmap -pk.

Deze tip is afkomstig van Bas van der Meer.

Een probleem is om alle keycodes te weten. Er is frontend voor xmodmap om grafisch alle toetsen in te kunnen stellen, te weten xkeycaps (http://www.jwz.org/xkeycaps/). Je kunt ook xev starten. Als je dan een toets intikt terwijl het venster van xev actief is, zie je ook de keycode. Alle keysyms (de namen voor de symbolen), zoals eacute kunnen worden gevonden in /usr/include/X11/keysymdef.h. Op http://www.chemie.fu-berlin.de/chemnet/use/xmodmap.html is ook een overzicht te vinden.

Je kunt xmodmap gebruiken om zelf wijzigingen aan te brengen t.o.v. van de standaard toetsenbordindeling. Hoe je de toetsenbordindeling instelt voor X kun je vinden in sectie Configuratie van het hoofstuk over X. Als je daarmee kiest voor us_intl heb je al een handige indeling om snel accenten in te kunnen tikken.

Input methods

Zeker voor de CJK-talen (Chinees, Japans, Koreaans) is de toetsen op bepaalde karakters mappen bij lange na niet toereikend. Je moet duizenden karakters in kunnen voeren met slechts enkele toetsen op het toetsenbord. Om dit voor elkaar te krijgen, heb je extra software nodig: IM's. IM staat voor Input Method. XIM is een protocol van X bedoeld voor dergelijke IM's.

Voorbeelden van IM's zijn kinput2 voor Japans, xcin voor Chinees en ami voor Koreaans. Als de IM is gestart moet je de shell-variabele XMODIFIERS zetten om de IM die je wilt gebruiken aan te geven. In geval van kinput2: export XMODIFIERS='@im=kinput2'. Vervang kinput2 door de gewenste IM. Vaak is het nodig programma's waar je de IM in wilt gebruiken te starten in een geschikte locale, voor kinput2 bijv. een Japanse zoals ja_JP.eucJP (Japans in eucJP-encodering).

De IM is vaak te starten en stoppen, zodat je het toetsenbord ook nog „gewoon” kunt gebruiken. Meestal is de toetsencombinatie om de IM te activeren shift-spatiebalk of ctrl-spatiebalk. Toetsen die je nodig hebt om daarna iets met de IM te doen, verschillen per IM. Of je de toetsen kunt wijzigen en hoe verschilt ook. Toetsen die vaak iets doen zijn de spatiebalk, shift-spatie, ctrl-spatie en ctrl-shift. Probeer ook insert, home en end eens.

Naast de klassieke IM's die gebruikmaken van XIM, zijn er ook modernere invoermethoden voor GNOME en KDE. Zowel GNOME als KDE hebben een immodule. Er zijn IM's die enkel hiermee werken, zoals im-ja (http://im-ja.sf.net) voor Japans in GNOME-applicaties. Een IM voor de immodule van GNOME of KDE kan resp. gekozen worden met de shell-variabelen GTK_IM_MODULE en QT_IM_MODULE. Deze variabelen kun je op xim zetten om een IM die gebruikmaakt van XIM te gebruiken.

De meeste IM's zijn oplossingen voor een enkele taal. Er is een tweetal projecten om een algemene IM te maken die overal voor werkt: SCIM (Smart Common Input Method) en UIM (Universal Input Method). Beide werken met XIM of de immodule van GNOME/KDE. SCIM lijkt het verst gevorderd en is bruikbaar voor 30 talen.

Andere invoermethoden

Bij GNOME zit gucharmap. In dit programma kun je elk Unicode-symbool vinden en vervolgens kopiëren. Er zijn verschillende methodes beschikbaar om naar een bepaald symbool te zoeken.

Als je maar heel af en toe letters met accenten en andere speciale karakters uit de Latin-1-set nodig hebt en je gebruikt Vim om bestanden te editen, dan kun je een handige functie van Vim gebruiken. Druk als je in insert mode zit op ctrl-k en daarna nog enkele toetsen. Een overzicht van mogelijke accenten (en wat andere speciale karakters) krijg je met :digraph in command mode. Zie ook sectie Vim over deze editor.

Het euroteken

Om het euroteken te kunnen gebruiken moet je een locale gebruiken met een karakterset waar het symbool überhaupt in kan worden weergegeven. Dat kan ISO-8859-15 of UTF-8 zijn. Localenamen die eindigen op @euro gebruiken ISO-8859-15. Verder moet je uiteraard fonts hebben waar het symbool in voorkomt. Je kunt controleren of je die (voor X) hebt door te kijken of er fonts geworden als je xlsfonts | grep iso8859-15 uitvoert. Sommige software (zoals programma's voor GNOME of KDE) kiezen uit zichzelf al een goed font, maar voor andere (zoals xterm) moet je zelf een goed font aanwijzen. In het geval van wat oudere software voor X moet dat met behulp van X resources. In de Debian Euro HOWTO staan wat aanwijzingen hoe je dat precies kunt doen voor enkele bekende programma's. Die aanwijzingen zijn niet Debian-specifiek.

Het laatste probleem is het mogelijk maken het eurosymbool zelf in te voeren. Je kunt de mogelijkheid zelf toevoegen met Xmodmap met de volgende twee regels:

keycode 113 = Mode_switch
keycode 26 = e E EuroSign

Je kunt nu het euroteken invoeren met de rechter alt en e. In een internationale toetsenbordinstelling is dit echter standaard al gedefinieerd. (Zie ook sectie Configuratie van het hoofstuk over X.)

 
Was dit artikel bruikbaar? ja / nee
Gerelateerde artikelen Hoe codeer je speciale tekens in html?
Op afstand werken
X windowing system
Tips & trucs
Basiskennis
GNU-utility's
Systeemconfiguratie
Software
Security
Sneltoetsen GIMP gebruiken
Artikel details
Artikel ID: 746
Categorie: Linux handboek 2008
Zoekwoorden karaktersets, encoderingen, lacales, linux, shell, internationalisering, language, taal, regio, tijdzone, iconv, xmodmap, euroteken, invoer, methoden, euro, invoermethode, eurosymbool, internationale, toetsenbordinstelling, standaard, toetsenbord, indeling
Datum toegevoegd: 6-Dec-2008 03:42:53
Aantal bekeken: 232
Beoordeling (Stemmen): Artikel nog niet beoordeeld (0)

 
« Ga terug