Počítač, jak už jeho název napovídá, dokáže pracovat pouze s čísly. V paměti, na sběrnicích nebo na pevném disku je pouze hromada čísel (a aby to nebylo jednoduché, jsou v binárním tvaru). Stejným problémem trpěly i dálnopisy a není divu, že počítačové řešení z nich vychází. Základní myšlenkou je přiřadit každému znaku číslo. Z hlediska počítače je tedy každý znak číslem a kódová tabulka určuje, co je to za znak. Většina potíží s kódováním pak vzniká v důsledku toho, že je text napsán v jednom kódování, ale čten v jiném.
ASCII
Aby se zabránilo tomu, že si každá aplikace vytvoří vlastní kódovací tabulku, byla vytvořena tabulka ASCII. Jedná se o 7bitové kódování, které pokrývá 127 znaků a je základem pro všechny další znakové sady.
Kam dát další písmena?
Největším problémem je, že byla ASCII (čili American Standard Code for Information Interchange) vytvořena ve Spojených státech, proto neobsahuje podporu pro znaky s diakritikou, což se týká velké části znaků, které v češtině potřebujeme. Jediným řešením bylo „psat cestinou bez nabodenicek“, což je bohužel dodnes jediným 100% spolehlivým způsobem, jak se potížím s diakritikou úplně vyhnout.
Základní ASCII zabírá 7 bitů, ovšem přirozená adresovatelná jednotka počítače je bajt, což je bitů osm. To představuje celkem 256 kombinací, takže logickým krokem bylo všechny potřebné znaky dát do horní poloviny tabulky. Bohužel pro nás, jako uživatele, vzniklo několik různých kódování. Odhlédneme-li od prakticky nepoužívané KOI8 nebo PC Latin2 z dob MS DOSu, máme v současné době standardní kódování ISO-8859-2 (používané na unixech), MacCE společnosti Apple a de facto (nikoliv de iure) standard CP-1250 (kódování MS Windows). O přístupu společnosti Microsoft, která je tvůrcem této tabulky, vypovídá v mnohém skutečnost, že se od ISO normy liší pozice několika málo znaků – Ž, Š, Ť, ž, š, ť.
Jedno kódování vládne všem
Ovšem ani 256 znaků není dostatek. Japonské, čínské nebo korejské abecedy obsahují tisíce piktogramů a při tvorbě univerzálního kódování bylo nezbytně nutné velikost znaku opět prodloužit. Z počátku na 16 bitů, ovšem ani 65535 znaků nebylo dost, takže bylo později rozšířeno na 32 bitů (4 bajty). Předpokládá se, že přes 4 miliardy možných znaků budou stačit. Ono kódování dostalo název Unicode (univerzální kód). Současná verze 3.0 definuje 32bitové znaky, takže text v něm zabírá čtyřikrát více paměťového prostoru než text v 8bitové znakové sadě.
Častěji se proto používá kódování UTF-8, které, na rozdíl od všech předchozích, nemá pevnou délku znaku. Pro text v angličtině je výhodou, že se v něm používají vesměs znaky z ASCII, proto bude takový text zabírat stejný prostor, jako by byl v ASCII. Čeština na tom je z tohoto pohledu také dobře, protože znaků s diakritikou, které se kódují dvěma bajty, není v českém textu tolik. V současné době používá velká část linuxových distribucí standardně právě UTF-8.
Konvertujeme
Linux nabízí celou řadu programů pro práci s kódováním.
iconv
Jeho manuálová stránka na debianních systémech sice za mnoho nestojí, ale přesto se jedná o velice užitečný nástroj. Použití je jednoduché:
iconv -f vstupni_kodovani -t vystupni_kodovani soubor[y]
Dekódovaný výsledek se posílá na standardní výstup. Argumentem -l si můžete zobrazit seznam různých kódování.
recode
Recode je mnohem pokročilejší aplikace. Mimo jiné dokáže odstranit diakritiku ze souboru.
cat dopis.txt Žluťoučký kůň úpěl ďábelské ódy recode utf-8..flat dopis.txt cat dopis.txt Zlutoucky kun upel dabelske ody
Je nutné mít na paměti, že recode vždy mění obsah souboru, takže je dobré si dělat zálohy.
enca
Obsahuje navíc i detekci znakové sady, takže náš dopis bez diakritiky enca rozpozná.
enca dopis.txt 7bit ASCII characters
Díky automatické detekci není nezbytně nutné uvádět výchozí znakovou sadu.
enca -x iso-8859-2 dopis.txt
Převod souboru do znakové sady, kterou máte na svém systému, provedete parametrem -c :
enca -c dopis.txt
Tento nástroj vytvořil David Nečas, takže není divu, že obsahuje vazbu na
cstocs
Což je konvertor specializovaný na češtinu a slovenštinu. Příkaz
enca -C extern -E cstocs -x ascii dopis.txt
Tedy opět odstraní diakritiku ze souboru. Ovšem má i mnoho užitečných funkcí, například dokáže nahradit © za (C) při převodu do ASCII. Převod z CP-1250 na UTF-8 se provede takto
cstocs cp1250 utf-8 < dopis.txt
convmv
Nejen obsah souborů, ale i jejich názvy bývá potřeba konvertovat. Následující příkaz vám opraví diakritiku v souborech pojmenovaných „®esky“.
convmv -f latin2 -t utf8 nazev_souboru
Textové editory
Další možností je využít služeb některého z textových editorů. Například v editoru Kate máte možnost si při otevírání vybrat kódování přímo v dialogu pro otevření nebo uložení souboru. Umí to i další editory, např. Quanta, Kile apod.
Hexdump
Skutečnost, že je text pouze hromada čísel, je velmi snadné ověřit. Příkaz hexdump zobrazuje obsah souboru právě v této formě.
$ cat dopis.txt | hexdump -C 00000000 41 68 6f 6a 20 73 76 c4 9b 74 65 0a |Ahoj sv..te.| 0000000c
Na místě znaku „ě“ jsou dvě tečky. Je tomu tak proto, že jeho kód c4 9b zabírá dva bajty, které jsou navíc v ASCII netisknutelné. Stačí změnit kódování souboru a podívat se, jak se změnil výstup
00000000 41 68 6f 6a 20 73 76 ec 74 65 0a |Ahoj sv.te.|
Znak „ě“ je teď reprezentován kódem ec.
Provádíme hromadné změny
Převádět jeden soubor po druhém může být otrava. Nebyl by to Linux, pokud by nenabízel možnost automatického zpracování. Nejlepším způsobem je použít příkaz find
find . -iname '*.txt' -exec recode cp1250..utf8 {} \;
Tímto způsobem se převedou všechny textové soubory v aktuálním adresáři (a podadresářích) z kódování CP-1250 do UTF-8. Příkaz find je velmi flexibilní, takže
find . -type f -exec convmv -f cp1250 -t utf-8 {} --notest \;
Změní názvy všech souborů z kódování Windows na UTF-8.
Hexadecimální soustava
V IT se používá šestnáctková soustava (číslice 0, 1, … e, f). Důvod je prostý. Když začneme psát převodní tabulku do binární soustavy pro desítkové číslice, zjistíme, že potřebujeme 4 bity, ale některé kombinace nejsou povoleny. Zatímco šestnáctkové číslice plně zaplní prostor 4 bitů. Jeden bajt se potom dá zapsat dvěma hexadecimálními číslicemi, což velice usnadňuje ruční převod. Například 1001 1011 je 9b, což je 155 (v desítkové soustavě), nebo 233 v osmičkové, která se v minulosti také používala.