Přejít na:

Jedním z nejjednodušších elektronických dokumentů je prostý textový soubor. I když to tak nemusí na první pohled vypadat, i prosté textové soubory skrývají některé záludnosti, pokud je chceme editovat a přenášet mezi různými platformami. Jelikož jsou i webové stránky a TeXové zdrojové texty čistě textové soubory, je dobré být si těchto úskalí vědom.

Přejít: navigace | na začátek stránky | na konec stránky

Znak konce řádků

Znak, který v textovém souboru signalizuje konec řádku (často označováno EOL), je na různých platformách různý, z těch nejrozšířenějších:

Znaky CRLF mají kořeny v technologii dálnopisných terminálů:

Přejít: navigace | na začátek stránky | na konec stránky

Praktické úkoly k procvičení

Vytvořte si v libovolném textovém editoru několikařádkový textový soubor. Ověřte, jaký znak konce řádků je použit:

Následně soubor konvertujte do podoby obvyklé na ostatních platformách.

Vyzkoušejte si, jaké problémy může přinést použití chybného znaku konce řádku:

TeX se k znakům konce řádku staví rozumně a CR+LF, LFCR jsou během čtení souboru nahrazeny znakem, který se nachází v registru \endlinechar (implicitně CR). HTML je k použitému znaku konce řádku rovněž lhostejný.

Přejít: navigace | na začátek stránky | na konec stránky

Kódování textu

Daleko větší problémy než různé znaky ukončení řádků však přináší rozdíly v kódování textu, tzn. interpretaci významu bajtů v textovém souboru.

Přejít: navigace | na začátek stránky | na konec stránky

Jednobajtová kódování

V současné době je nejzákladnějším standardem pro kódování textu na nejrozšířenějších platformách kód ASCII. Ten však nepokrývá potřeby většiny jazyků krom angličtiny, má jen velmi omezené pokrytí speciálních znaků apod.

Tip: Pomocí ASCII escape sekvencí ve zdrojovém textu umožňuje TeX sázet i různé cizokrajné znaky. V případě nedostupnosti vhodného znaku v použitém fontu je však výsledek vytvořen složením samotatného znaku písmene (např. d) a znaku akcentu (např. ˇ). Výsledek strojové kombinace obou znaků však často nemusí dávat optimální optický výsledek v porovnání s ručně optimalizovanou kresbou znaku (nevhodné zarovnání na osu znaku, potřeba zcela odlišné kresby háčku při kombinaci s písmenem d než při kombinaci s písmenem c apod.). K tomu řešení se tedy přistupuje jen v nouzi.

Historicky se pro potřeby neanglických jazyků začala nejdříve používat různá jednobajtová kódování. Vznikly různé standardní kódové stránky, které specifikovaly, jak interpretovat který bajt v textovém souboru. Pro češtinu se mimo jiné používalo kódování

Problém je, že jednobajtové kódování má vždy k dispozici pro jeden znak právě jeden bajt. Není tedy možné v jedné kódové stránce mít více než 256 různých znaků, což je pro některé jazyky značně omezující (extrémním příkladem může být například tradiční čínština používající tisíce různých znaků).

Informace o použité kódové stránce navíc není v čistě textovém souboru nikde uvedena. Zpracovatel tedy musí vědět, která kódová stránka byla použita, jinak dojde k chybné interpretaci textu.

Tip: Existují nástroje, které mohou zkusit kódování textu odhadnout. Jedním z nich je např. program enca.
Jinou možností pro detekci kódování je např. file -bi.

Kvůli chybějící indikaci není ani možné používat více kódových stránek v jednom souboru (např. pro zakódování textu ve dvou různých jazycích, kdy každý z nich vyžaduje jiné jednobajtové kódování).

Přejít: navigace | na začátek stránky | na konec stránky

Unicode

Problémy jednobajtových kódování řeší standard Unicode. Zjednodušeně si jej můžeme představit jako seznam dvojic číslo:znak, kde je každému znaku přiřazeno nějaké jednoznačné identifikační („katalogové“) číslo. Například znak š má přiděleno číslo 353, znak (pomlčka) číslo 8211 atd.

Tip: Velmi užitečnou aplikací pro vyhledávání informací o Unicode znacích a hledání znaků samotných je webová aplikace UniView.

Povšimněte si, že počet znaků, které Unicode pokrývá, mnohonásobně převyšuje 256 možností zakódovatelných do jediného bajtu – například ona pomlčka () už je spolehlivě mimo tento rozsah. Musí tedy být definován i nějaký způsob, jak vysoká „katalogová“ čísla znaků uložit jako posloupnost bajtů do souboru (k zakódování čísel větších než 255 už nám nestačí jeden bajt, takové číslo musí být uloženo v několika bajtech). Existuje několik způsobů Unicode kódování:

Příklad – endianita: Mějmě (desítkově zapsaná) čísla (mezery ve všech zápisech v příkladu jsou přidány jen pro přehlednost):

  • 1 245 391 901
  • 379 976 145

Šestnácková reprezentace čísel pak je:

  • 4A 3B 2C 1D
  • 16 A5 F9 D1

Binární reprezentace čísel pak je:

  • 0100 1010  0011 1011  0010 1100  0001 1101
  • 0001 0110  1010 0101  1111 1001  1101 0001

Little-endian posloupnost bajtů v souboru při zápisu obou čísel za sebou:

  • 1D 2C 3B 4A  D1 F9 A5 16

Big-endian posloupnost bajtů v souboru při zápisu obou čísel za sebou:

  • 4A 3B 2C 1D  16 A5 F9 D1

Příklad – kódování UTF-8: Mějme následující Unicode znak:

Tento znak má několik možných reprezentací. Jedna možná reprezentace sestává ze tří samostatných grafémů:

Binární reprezentace čísel jednotlivých grafémů je následující:

  • 100 0001
  • 11 0000 1010
  • 11 0000 0001

Kódování UTF-8 nám jednoznačné zadává, jak binární reprezentaci grafémů zakódovat:

  • 0100 0001
  • 1100 1100 1000 1010
  • 1100 1100 1000 0001

Znak Ǻ tedy zakódujeme následující posloupností pěti bajtů:

  • 41 CC 8A CC 81

Jak jsme zmínili, existuje několik reprezentací znaku Ǻ. Namísto výše uvedené trojice grafémů můžeme např. přímo použít grafém Latin Capital Letter A with Ring Above and Acute (grafém číslo 506), který zakódujeme pomocí dvou bajtů C7 BA.

Toto nám činí problémy např. tehdy, když chceme v textu najít konkrétní slovo. Prohlížeče a editory textových dokumentů totiž většinou pracují na úrovni grafémů, ne znaků, a jinak reprezentované slovo nemusí najít. Abychom se tomuto problému vyhnuli, můžeme reprezentaci znaků v dokumentu sjednotit pomocí tzv. Unicode normalizace implementované např. nástrojem uconv: $ printf '\x41\xCC\x8A\xCC\x81' | hexdump -C
00000000  41 cc 8a cc 81                                    |A....|
00000005

$ printf '\x41\xCC\x8A\xCC\x81' | uconv -x any-nfc | hexdump -C
00000000  c7 ba                                             |..|
00000002

Přejít: navigace | na začátek stránky | na konec stránky

Praktické úkoly k procvičení

Prohlédněte si odkazované články o jednobajtových kódováních a porovnejte rozdíly mezi kódovými stránkami.

Vyzkoušejte si, jak vypadá chybná interpretace textu při chybně zvoleném kódování v programu text zpracovávajícím.

Převeďte soubor plaintext-cp1250.txt do Unicode v kódování UTF-8.

Přejít: navigace | na začátek stránky | na konec stránky