- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 11/2000

Čeština v Linuxu

Vladimír Michl

Úvod

Na začátek je třeba říci něco o kódování češtiny. Existuje několik kódování, které lze pro češtinu a slovenštinu použít. Jsou to kódování Kamenických (cp895), cp852 (Latin 2), Windows-1250 (cp1250) a ISO-8859-2 (ISO Latin 2). Ve světě UNIXů a Internetu se používá kódování ISO-8859-2. Na převody mezi kódováními existuje několik utilit, vyzdvihnu ale dvě: GNU recode a cstocs. V rámci sjednocení nástrojů doporučuji (pokud je to možné) používat GNU recode. Například převod z Windows-1250 do ISO Latin 2:
recode windows-1250..l2 <soubor.txt >soubor-l2.txt

Konzole

Aby bylo jasné, co a jak nastavit pro to, aby fungovalo psaní českých písmenek na konzoli, je třeba udělat malý úvod, jak to funguje.

Ovladač konzole se skládá ze dvou částí, ovladače klávesnice a ovladače obrazovky. Je třeba vhodně nastavit oba, abychom byli spokojeni.

Klávesnice

Ovladač klávesnice umožňuje pracovat (mimo jiné) ve dvou režimech, a to osmibitový výstup a unicodový (UTF-8). Režim přepínáme pomocí příkazu kbd_mode. Ovladač je implicitně nastaven v osmibitovém režimu, který budeme používat i my. Ovladač klávesnice může být pro každou konzoli nastaven zvlášť.

Klávesové mapy zavádíme pomocí příkazu loadkeys. Pro český psací stroj s anglickými "z" a "y" to bude například:

loadkeys cz-lat2.map.gz

Dostupné klávesové mapy lze obvykle nalézt v adresáři /usr/share/keymaps/i386/qwerty nebo /usr/lib/kbd/keymaps/i386/qwerty.

K dispozici jsou ještě další klávesové mapy qwerty/cz-lat2-prog a qwertz/cz-us-qwertz. Klávesová mapa je společná pro všechny konzole. Mezi českou a anglickou klávesnicí se přepíná pomocí klávesy Pause.

Odkazy: kbd_mode(1), loadkeys(1), keymaps(5)

Obrazovka

Ovladač obrazovky lze nastavit do dvou módů: UTF-8 (Unicode) a do osmibitového. Zatím se obvykle používá osmibitový režim.

Vnitřně pracuje ovladač v Unicode, což nám teoreticky umožňuje zobrazit znaky všech abeced (samozřejmě v Unicode definovaných). Bohužel hardware nás omezuje, v případě VGA je to na 512 současně zobrazitelných různých znaků. Proto byl vymyšlen následující mechanismus.

Každý font může mít maximálně 512 znaků. S každým fontem se do jádra nahrává také tabulka, která říká, jakým znakem z fontu se mají zobrazovat znaky z Unicodu. Tato tabulka je v anglické literatuře označována jako Screen Font Map (SFM).

Pokud je konzole v UTF-8 režimu, převede se znak z UTF-8 na šestnáctibitový unicodový (UCS2) a pomocí SFM je stanoven znak z fontu, který má být zobrazen (viz obr).

V případě osmibitového režimu je to trochu složitější. Osmibitový znak je podle aktivního charsetu (G0 nebo G1) překódován do Unicodu. Charset může být nastaven do čtyř režimů: Latin1 do PC, vt100 grafika do PC, PC do PC a uživatelsky definovaná tabulka ACM.

Schema konverzí znaků, při cestě z aplikace na obrazovku

Tabulky SFM a ACM jsou globální, tj. společné pro všechny konzole, nastavení režimu (8bit, UTF-8), charsetu (která tabulka) a který charset (G0, G1), je pro každou konzoli zvlášť.

Pro nastavení klávesnice, fontu a tabulek (Maps) se používal balík kbd, který nastavoval klávesnici, font a pouze ACM, jelikož starší jádra měla pouze ACM tabulku. Později byl balík kbd nahrazen balíkem console-tools, který již umí zavést unicodové fonty a nastavit SFM.

Nastavení fontu:

consolechars --acm=iso02 --font=lat2u-16

případně setfont, používáte-li balík kbd. SFM tabulka je někdy (většinou) přibalena ve fontu, a proto ji není třeba zavádět zvlášť.

Pro každou konzoli zvlášť je třeba (například do /etc/profile):

echo -ne '\033%@'  # 8bitový režim
echo -ne '\017'    # Použití charsetu G0
echo -ne '\033(K'  # V G0 použít ACM

Odkazy: consolechars(8), console_codes(4), unicode(7), utf-8(), setfont(8), mapscrn(8)

Locales

Tato část systému se stará o definice chování prostředí v různých jazycích, a to definice znaků abecedy (co jsou malá písmena, co velká, převody z malých na velká a opačně), pravidla při abecedním řazení, definice zápisu numerických a peněžních údajů, umožnění komunikace programu ve více jazycích.

Locales jsou rozdělena do několika kategorií:

  • LC_CTYPE - kategorie znaků, ovlivňuje rozpoznávání jednotlivých znaků programem (co je malé písmeno, co velké, jaké je malé písmeno k velkému apod.)
  • LC_COLLATE - použita při porovnávání znaků, tj. abecedním řazení
  • LC_TIME - použita při vstupu a výstupu časových údajů, definuje jejich formát.
  • LC_NUMERIC - použita při vstupu a výstupu numerických údajů (čísel). Například pro zapnuté českého prostředí by se číselné údaje měli vypisovat následovně: 1 000 125,00
  • LC_MONETARY - definuje výstup peněžních údajů, formát peněžních čísel, označení měny, kde má být označení umístěno a zda má být odděleno mezerou.
  • LC_MESSAGES - v jakém jazyce bude program komunikovat (vypisovat zprávy).

Každou kategorii můžeme nastavit zvlášť a díky tomu můžeme program nastavit třeba tak, aby komunikoval v anglickém jazyce, ale texty, které budeme psát a upravovat, považoval za české a třeba i řadil slova podle českých pravidel.

Jednotlivé kategorie nastavujeme proměnnými prostředí, jejichž jména jsou shodná s názvy kategorií. Např:

export LC_CTYPE=cs_CZ.ISO-8859-2

Existují také proměnné, které ovlivňují globální nastavení. Jsou dvě:

  • LC_ALL
  • LANG

LC_ALL je proměnná s nejvyšší prioritou, pokud ji nastavíme, přebije všechna ostatní nastavení. Proměnná LANG má zase nejmenší prioritu. Pokud není nastavena proměnná LC_ALL nebo proměnná příslušné kategorie, použije se pro tuto kategorii hodnota z LANG.

Definiční soubory pro locales se obvykle nachází v /usr/share/locale, kde je pro každý jazyk vytvořen adresář, ve kterém pak jsou definiční soubory. Tyto soubory jsou v binárním tvaru. Zdrojové soubory locales pak jsou v adresáři /usr/share/i18n.

Jak proměnné nastavit

Hodnoty proměnných LC_* a LANG by se měly řídit podle pravidla:

zkratkajazyka[_ZKRATKAZEMĚ[.kódování]]

přičemž pro český jazyk je zkratka "cs" a zkratka České republiky je "CZ". Pro slovenský jazyk je zkratka "sk" a pro Slovenskou republiku "SK". Proměnné tedy budeme nastavovat na "cs_CZ" ("sk_SK") případně "cs_CZ.ISO-8859-2" ("sk_SK.ISO-8859-2"). Zkratky jazyka definuje norma ISO 639 a zkratky zemí definuje norma ISO 3166.

V souboru /usr/share/locale/locale.alias najdeme aliasy, kterých lze také pro nastavení proměnných použít. Pro češtinu tam najdeme "czech", pro slovenštinu "slovak".

Tyto proměnné nastavujeme obvykle buď pro všechny uživatele v /etc/profile řádkem:

export LC_ALL=cs_CZ.ISO-8859-2
nebo pro jediného uživatele stejným řádkem v .profile nebo .bash_profile v domovském adresáři uživatele.

Nastavení jednotlivých kategorií lze jednoduše zjistit pomocí příkazu locale.

Odkazy: locale(7), locale(1), locale(5), Lokalizace http://www.linux.cz/seminare/jevicko1998/Lokalizace/lokalizace.ps

X Window System

České prostředí v systému X Window je trochu více problematická záležitost.

Aby aplikace mohla přijímat české znaky, je třeba, aby knihovna jazyka C uměla tyto znaky rozpoznávat. K tomu musí být korektně nastavena kategorie LC_CTYPE na "cs_CZ" případně "cs_CZ.ISO-8859-2".

V případě, že spouštíme X server pomocí startx může být nastavení provedeno v /etc/profile nebo /.[bash_]profile. V případě, že X server je spouštěn z xdm, je třeba nastavení provést buď v .xsession (Debian) nebo .Xclients (Red Hat) před spuštěním správce oken (pro jednoho uživatele), nebo na začátku /etc/X11/Xsession (Debian) nebo /etc/X11/xinit/Xclients (Red Hat) pro všechny uživatele.

Dále program musí podporovat přijímání českých znaků, a to tzv. Input metody, a ještě musí korektně na začátku programu inicializovat internacionalizaci jak Xlib, tak libc, tak i přípravků, které používá. Mnoho programů tak nečiní, a tak je těžké je přinutit k českému (slovenskému) psaní.

Klávesnici můžeme nastavit dvěma způsoby: přes Xmodmap nebo xkb. V distribucích se obvykle používá xkb řešení, které je závislé na X serveru. Xmodmap řešení není na X serveru závislé. Nastavení mapy xkb klávesnice se provádí v /etc/X11/XF86Config v sekci Keyboard, klíčová slova Xkb*. To, jaká jména klávesnic pro XkbKeymap můžete použít, zjistíte v /usr/lib/X11/xkb/keymap.dir.

Xmodmap řešení najdete na webové stránce Zdeňka Kabeláče http://www.fi.muni.cz/~kabi/linux/linux.html, kde také najdete knihovnu libi18n, kterou lze použít pro vnucení českých znaků do aplikací, které se nechovají internacionálně.

Mezi českou a anglickou klávesnicí se přepíná pomocí klávesy Scroll Lock.

Tisk

Pokud píšete nový dokument, je nejlépe psát ho v (La)TeXu, jelikož zde je podpora českého tisku zatím vyřešena nejlépe. Jako textové WYSIWYG editory pro systém X Window lze také použít Applixware, Star Office nebo AbiWord. Pro LaTeX existuje WYSIWYG nadstavba LyX.

Pro převod českých ASCII textů do PostScriptu pro tisk, lze použít balík a2ps. Tisk ze systému X Window zatím není uspokojivě řešen. Většinou je vygenerovaný PostScript kódován v ISO-8859-2, ale PostScript používá ISO-8859-1 fonty. Někdy je na PostScript možno použít balík ogonkify, který může problém vyřešit, například tisk z Netscape.

Pro tisk dokumentů z PostScriptu na tiskárnu se používá balík Ghostscript. Tento balík ve verzi 6.0 už konečně obsahuje Type1 fonty, které mají ISO-8859-2 znaky, což by mohlo znamenat konečně blýskání na lepší časy. Další Type1 fonty (postscriptové) jsou k dispozici na ftp://ftp.penguin.cz/pub/cestina/fonty-cz, http://www.intersoft.cz/linux/fonts.

Někdy je třeba mít nastaveno pro korektní zobrazování Type1 fontů ve WYSIWYG editorech kódování fontu v souboru fonts.dir, který je ve stejném adresáři jako Type1 fonty, na

*-adobe-fontspecific

Někdy také pomůže nastavení aliasu v souboru fonts.alias na

*-iso8859-2 *-adobe-fontspecific

Poznámka: za "*" doplníte konkrétní název fontu z fonts.dir bez kódování.

Nastavení v distribucích

Red Hat

Pokud ve verzi 6.2cz zatrhnete balík czech-adaptation, jsou všechna potřebná nastavení udělána za Vás. Následuje popis, kde je co nastaveno:

V /etc/sysconfig/i18n je definován font a nastavení proměnných LC_* a LANG. V /etc/inputrc je nastaveno povolení 8bit znaků na terminálu pro shell bash. Implicitní klávesová mapa je zadána v souboru /etc/sysconfig/keyboard. Konzolové fonty, klávesové mapy apod. najdete v adresáři /usr/lib/kbd.

V konfiguračním souboru /etc/X11/xinit/Xkbmap nebo /etc/X11/XF86Config definujeme klávesové mapy pro systém X Window. Cestu k fontům definujeme buď v /etc/X11/fs/config v případě X Font Serveru (implicitně) nebo v /etc/X11/XF86Config. Fonty pro X server najdeme v adresáři /usr/lib/X11/fonts.

Debian

Pro Debian 2.1 nainstalujte balík skcz-slink. Docílíte tím instalace klávesnicových map pro systém X Window.

Nejprve je třeba vyměnit balík kbd za console-tools. V /etc/console-tools/config nastavit SCREEN_FONT na lat2u-16 a APP_CHARSET_MAP na iso02. Pomocí kbdconfig nastavit klávesnici. V /etc/inputrc odkomentovat "convert-meta". Do /etc/profile doplnit:

case `tty` in /dev/tty[0-9]|/dev/tty[0-9][0-9]
        echo -ne '\033%@\017\033(K'
esac
export LANG=czech
export LC_ALL=czech

Po spuštění /etc/rc.boot/console-tools (Debian 2.1) nebo /etc/init.d/console-screen.sh (Debian 2.2) a /etc/init.d/keymaps-lct.sh start a novém přihlášení by vše mělo fungovat. Klávesové mapy pro konzoli najdeme v adresáři /usr/share/key\=maps a konzolové fonty apod. v adresářích /usr/share/console*.

Klávesové mapy pro systém X Window nastavujeme v konfiguračním souboru /etc/X11/XF86Config v sekci Keyboard, např. na XkbKeymap "xfree86(us_cz_qwerty)". Hodnoty můžete zjistit v souboru /usr/lib/X11/xkb/keymap.dir. ISO Latin 2 fonty najdete v balících xfonts-biznet-iso-8859-2-* a xfonts-intl-european. Pro Debian 2.1 balík xfntil2. Cesty k fontům se nastavují v /etc/X11/XF86Config v sekci Fonts. Pro Debian 2.2 není třeba cesty nastavovat, pro Debian 2.1 je třeba v /etc/X11/XF86Config v sekci Files doplnit na začátek cesty k il2 fontům:

FontPath   "/usr/X11R6/lib/X11/fonts/misc-il2/"
FontPath   "/usr/X11R6/lib/X11/fonts/75dpi-il2/"
FontPath   "/usr/X11R6/lib/X11/fonts/100dpi-il2/"

Je-li X server startován přes xdm (po nastartování počítače naběhne přihlašovací okno v grafickém režimu), musíme LC_CTYPE nastavit v /etc/environment nebo /etc/X11/Xsession.

Aplikace

Aby fungovali některé aplikace, je třeba jim trošku pomoci. U konzolových je většinou potřeba nastavit akceptování 8bit znaků, u některých X aplikací jim znaky vnutit pomocí nečistých metod (libi18n). Informace o "počeštění" aplikací najdete v Czech-HOWTO.

less

Aby less zobrazoval české znaky, je třeba nastavit proměnnou prostředí LESSCHARSET na hodnotu latin1. Například v /etc/profile:
export LESSCHARSET=latin1

ls

Pro korektní zobrazování názvů souborů s českými znaky je třeba spouštět příkaz ls s přepínačem -N. Tedy do /etc/profile umístíme:
alias ls='/bin/ls -N'

Připojení disků z Windows

Pokud připojujeme disky z českých Windows, obvykle budeme chtít vidět názvy souborů i s českými písmenky. Předpokládám, že připojovaný oddíl máme napsán v /etc/fstab. Do položky \em{options} doplníme:

iocharset=iso8859-2,codepage=852

tedy kompletní položka může vypadat třeba následovně:

/dev/fd0 /mnt/a vfat user,noauto,\
       iocharset=iso8859-2,\
       codepage=852,umask=000,\
       quiet 0 0

nvi

Editor nvi zobrazuje místo znaků české abecedy jejich hodnotu v hexadecimálním tvaru. Tomuto zamezíme přidáním následujících řádků do /etc/vi.exrc:
set print=\
"áÁäÄčČďĎéÉěĚíÍľĽĺĹňŇóÓôÔŕŔřŘšŠťŤúÚůŮýÝžŽ"
set print=""

Gtk

Setkal jsem se s případem, že Gtk verze 1.2 mi nechtělo vypisovat zprávy, které obsahovaly nějaký český znak. Pomohlo následující nastavení proměnných prostředí:
export LC_ALL=cs_CZ
export LANG=cs_CZ

*


- předchozí článek - následující článek - obsah - úvodní stránka -