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 se mají 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í [nepovinné]

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.

Tip: V textovém editor Vim si můžete mimo dalších užitečných informací snadno nechat zobrazovat informaci o aktuálně používaném formátu a kódování editovaného souboru na stavové liště v dolní části okna editoru. Stačí si do souboru ~/.vimrc přidat obdobný kód: " Vzdy zobrazovat stavovou listu.
set laststatus=2

" Prizpusobeni informaci zobrazenych ve stavove liste okna.
set statusline=[%n/%{bufnr(\"$\")}]\ %<%F\ \ %h%m%=[%W%Y%R%{\",\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\",B\":\"\").\"\"}%{\",\".(&fileformat)}]\ %k\ %-14.(%l,%c%V%)%P\ (%LL,\ %{getfsize(expand(\"%:p\"))==\"-1\"?\"-\":getfsize(expand(\"%:p\"))}C)
Více viz integrovaná nápověda Vimu. :help laststatus
:help statusline

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.

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 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ř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.txt do Unicode v kódování UTF-8.

Pokud odevzdáváte práci ze cvičení e-mailem, přiložte veškeré textové soubory, které jste vyrobili. Pokud jste pracovali pod Unixem, uveďte i odpověď na otázku z posledního bodu.

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