Linux E X P R E S

Facebook

Kódování textu na počítači

Tento článek by se také mohl jmenovat „Proč mi nefunguje čeština?“ Zabývá se problematikou kódování a znakových sad.


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.

Diskuze (4) Nahoru