Tehdy musel být v Internetu řešen problém, jak spolu budou komunikovat
počítače, které mají navzájem odlišný vnitřní kód i způsob ukládání dat.
Základní možnosti Internetu -- TELNET , MAIL a ASCII-režim FTP -- zajišťují
pro uživatele především zprostředkování textových řetězců. A tak došlo
poměrně snadno ke shodě, že v těchto textových řetězcích budou moci všichni
používat malá a velká písmena latinské abecedy, (arabské) číslice a na
počítačích běžně známé zvláštní znaky jako + , - , * , / , ( , )
a podobně. Ty se budou po síti přenášet v kódu ASCII -
American Standard
Code for Information
Interchange - a na každém počítači se provede
konverze do vlastního kódu, pokud bude tento kód odlišný. Tyto bezproblémově
použitelné znaky jsou uvedeny v následující tabulce:
ASCII-1 tabulka ( bez řídících znaků )
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 @ P ` p 1 ! 1 A Q a q 2 " 2 B R b r 3 # 3 C S c s 4 $ 4 D T d t 5 % 5 E U e u 6 & 6 F V f v 7 ' 7 G W g w 8 ( 8 H X h x 9 ) 9 I Y i y A * : J Z j z B + ; K [ k { C , < L \ l | D - = M ] m } E . > N ^ n ~ F / ? O _ o
Vývoj počítačů postupně dospěl k tomu, že v současnosti většina počítačů
má součástí svého vlastního kódu přímo tuto tabulku ASCII-1. Mezi podstatné
výjimky patří asi jedině větší počítače IBM, které pracují ve vlastním
odlišném kódu, a to v kódu EBCDIC - Extended
Binary Coded
Decimal Interchange
Code . Pro srovnání je zde uvedena i tato tabulka.
Kód EBCDIC ( varianta EBCDIC-US )
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 & - { } \ 0 1 / a j ~ A J 1 2 b k s B K S 2 3 c l t C L T 3 4 d m u D M U 4 5 e n v E N V 5 6 f o w F O W 6 7 g p x G P X 7 8 h q y H Q Y 8 9 ` i r z I R Z 9 A c ! i : B . $ , # C < * % @ D ( ) _ ' E + ; > = F | ^ ? "
Při podrobném porovnání obou tabulek si je možno všimnout, že v tabulce
kódu EBCDIC nikde nejsou hranaté závorky [ , ]
a naopak v pozicích '4A' a '6A' jsou (kurzívou psané) znaky
c a i . Mají nahrazovat znaky pro
americký cent -c-
a přerušovanou svislou čáru ¦ . Pro úplnost ještě doplňme,
že mezera, ta je jak známo '20' v tabulce ASCII, jest '40' v EBCDICu
a dále znak ^ ( tedy '5F' ) by měl býti graficky více
podobný (matematickému) symbolu negace ¬ .
Pro přenos v Internetu se znaky z tabulky ASCII-1 transformují do kódu
EBCDIC přirozeným způsobem svého významu, znak ^ na negaci
^ a obvykle potom "nelogicky" znak [ na
c a znak ] na znak i .
A tím je zaručena kompatibilita s ostatními počítači v síti Internet.
Uživatelé samozřejmě musí počítat s tím, že například "cent" je hranatá
závorka. Pochopitelně si na to obvykle vzpomenou, až když si nějaký dokument
získaný z Internetu vytisknou na své tiskárně ( pracující v EBCDICu ).
Je třeba ještě poznamenat, že zvláště v národních variantách kódu EBCDIC, kde byla volná místa v tabulce využita buď pro znaky s diakritikou anebo pro jiné znaky ( řečtiny, ruštiny ), se již v pozicích '4A' až '7A' nacházejí znaky [ , ] , ! , : ( v tomto pořadí ). Z hlediska grafické podoby bylo méně podstatné, že se ještě prohazovalo umístění znaků: ! | ¦ Problém se ale mohl výrazně projevit při použití nepatřičné verze kompilátoru, který předpokládal například pro "logické nebo" používání jen jednoho z těchto znaků. V tomto směru na kompatibilitu pro snazší přenášení programů byly připraveny některé kompilátory bývalých počítačů jednotné řady JSEP. Pracovaly v kódu DKOI , což byl EBCDIC s azbukou. A třeba v jazyce PL/1 se mohl pro "nebo" používat jak znak | tak ! . Zásadně ale v kódu DKOI neexistoval znak $ , přesně na místě '5B' byl znak "sluníčko", tedy univerzální znak měny ¤ .
Pozice, kde je v těchto tabulkách kódu ten který znak umístěn, odpovídá jeho bitové hodnotě. Jeden znak vždy zaujímá jeden byte, tedy v Internetu jeden oktet. Umístění znaku v tabulce přesně koresponduje s jeho hodnotou vyjádřenou hexadecimálně. Anebo jinak, označení sloupce odpovídá hexadecimální hodnotě prvního půlbytu a označení řádky hodnotě druhého půlbytu.
`0000` = '0' ( = 0 )
`0001` = '1' ( = 1 )
`0010` = '2' ( = 2 )
`0011` = '3' ( = 3 )
`0100` = '4' ( = 4 )
`0101` = '5' ( = 5 )
`0110` = '6' ( = 6 )
`0111` = '7' ( = 7 )
`1000` = '8' ( = 8 )
`1001` = '9' ( = 9 )
`1010` = 'A' ( = 10 )
`1011` = 'B' ( = 11 )
`1100` = 'C' ( = 12 )
`1101` = 'D' ( = 13 )
`1110` = 'E' ( = 14 )
`1111` = 'F' ( = 15 )
Toto jsou všechny možnosti naplnění půlbytu, tj. 4 bitů , celkem tedy
2 ** 4 = 16 možností. K jejich rozlišení potřebujeme 16
různých znaků a těmi jsou cifry 0 - 9 a písmena A až F .
Cifry 0, 1, .. , 9 jsou přitom přiřazeny bitovým kombinacím
představujícím tuto hodnotu ve dvojkové soustavě a pro hodnotu 10 je pak
používán znak A , pro hodnotu 11 písmeno B atd.
Příkladně tedy písmeno malé p , které je v ASCII-tabulce v pozici
'70' , odpovídá právě naplnění prvních 4 bitů z celého oktetu jako '7'
a druhých 4 bitů '0' , tedy
p = `01110000` = '70'
Na rozdíl od tohoto hexadecimálního způsobu vyjádření obsahu bytu (oktetu)
se v číselných adresách Internetu bitové naplnění oktetu vyjadřuje tomu
odpovídající číselnou hodnotou ( v desítkové soustavě ). Takto tedy
p odpovídá číselné hodnotě 7 * 16 + 0 = 112 .
Znaky v tabulce ASCII-1 jsou rozmístěny v oblasti
mezera | = ` 0010 0000 ` = '20' ( = 32 ) |
! | = ` 0010 0001 ` = '21' ( = 33 ) |
. . . | |
~ | = ` 0111 1111 ` = '7E' ( = 126 ) |
DEL | = ` 0111 1111 ` = '7F' ( = 127 ) |
Ještě je třeba se zmínit o hodnotách '00' až '0F' . Tyto bitové kombinace se používají pro tzv. řídící znaky využívané k řízení programových funkcí. Příkladně tedy znaky '0D' a '0A' znamenají v textu konec řádky, znak '0C' označuje novou stránku, '1A' konec textové editace. A jak to již bývá, v různém systémovém prostředí, ale i pro různé funkce se mohou lišit zásady jejich používání. Nejznámějším příkladem je asi značení konce řádky textového souboru v MS-DOSu a v prostředí Unixu. V obou jsou textové znaky shodné ( v kódu ASCII ), ale pro označení konce řádky předpokládá MS-DOS použití dvojice (řídících) znaků '0D' '0A' zatímco v Unixu se používá jen znak '0A' . Analogicky mají i internetové funkce definováno použití řídících znaků. Tak například v Gopheru mají mít přenášená menu jednotlivé řádky zakončeny dvojicí znaků '0D' '0A' . Ve WWW naopak úspěšně zpracovávají HTML-dokumenty všichni klienti, jen pokud jejich řádky končí pouze znakem '0A' .
Když se podíváme blíže na hodnoty všech znaků v tabulce
ASCII-1 [1]
( včetně řídících znaků neuváděných
v ní explicitně ), je jejich číselná hodnota vždy v rozmezí 0 až 127
a ve všech bitových kombinacích těchto znaků ASCII-1 je první bit nulový.
Teoreticky bychom tedy pro jejich přenos vystačili jen se 7 bity. A odtud plyne
ono označení kompatibility v Internetu jako 7-bitové.
Přenos v Internetu je ovšem principiálně 8-bitový. ( S výjimkou kdysi možná existujících nestandardních emulací Internetu do prostředí jiných komunikačních sítí.) Úspěšná interpretace přenášeného textu je ovšem zaručena v Internetu jen tehdy, když každý oktet má první bit nulový. Samozřejmě vzniká otázka, jak se vyrovnat s textovými řetězci, které obsahují oktety s nenulovým prvním bitem. V Internetu se rozšířil jednoduchý způsob, jímž se v některých případech programátoři s touto situací vyrovnávají. První bit se jednoduše vynuluje a ostatní bity se ponechají nezměněné. Oktet je možno dále zpracovávat jako ASCII-1, ale významná část informace zůstala zachována. Koncový příjemce může v mnoha případech odhadnout, že došlo k nulování 1.bitu a v případě nutnosti text či spíše jednotlivé znaky zpětně i zrekonstruovat. S nulováním prvního bitu se lze nejčastěji setkat v některých implementacích TELNETu nebo při přenosu dopisů (E-mailu) - viz APPENDIX A v RFC821 [2].
Protože ale nelze takovýmto algoritmickým způsobem vytvořit kódování
českých znaků s diakritikou, v němž by se zároveň případným nulováním
prvního bitu odstranily v textu háčky a čárky, dopadla věc pochopitelně tak,
že existuje větší počet rozdílných tabulek kódování české diakritiky.
Nejznámější kódy češtiny vycházejí z tabulky ASCII-1 a znaky s diakritickými
znaménky jsou umístěny do její volné druhé poloviny, tedy mezi '80' až 'FF' .
Následující tabulka je označena jako ASCII-2 a je naplněna analogicky tabulce
ASCII-1 [1],
v příslušném sloupci a řádce
jest znak odpovídající oné hexadecimální hodnotě ( opět vyjma řídících znaků ).
Otázkou ovšem je, jak jsou tyto znaky různými WWW-klienty a v různých
systémových prostředích na výstupu pro uživatele interpretovány, tedy co
vidí uživatel na obrazovce.
ASCII-2 tabulka ( bez řídících znaků )
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 @ P ` p ° Ŕ Đ ŕ đ 1 ! 1 A Q a q Ą ą Á Ń á ń 2 " 2 B R b r ˘ ˛ Â Ň â ň 3 # 3 C S c s Ł ł Ă Ó ă ó 4 $ 4 D T d t ¤ ´ Ä Ô ä ô 5 % 5 E U e u Ľ ľ Ĺ Ő ĺ ő 6 & 6 F V f v Ś ś Ć Ö ć ö 7 ' 7 G W g w § ˇ Ç × ç ÷ 8 ( 8 H X h x ¨ ¸ Č Ř č ř 9 ) 9 I Y i y Š š É Ů é ů A * : J Z j z Ş ş Ę Ú ę ú B + ; K [ k { Ť ť Ë Ű ë ű C , < L \ l | Ź ź Ě Ü ě ü D - = M ] m } ˝ Í Ý í ý E . > N ^ n ~ Ž ž Î Ţ î ţ F / ? O _ o Ż ż Ď ß ď ˙
Prvni polovina tabulky jest shodná s ASCII-1 a má se v každém případě jevit
stejně, neboť představuje onu 7-bitovou kompatibilitu Internetu. Druhá polovina
tabulky pak vypadá v tom kterém prostředí podle toho, jaký kód češtiny ( nebo
jiného jazyka ) má ve svém prostředí uživatel nainstalován. Pokud takovouto
změnu "kódové stránky" umožňuje i právě použitý WWW-klient, je možno se o tom
změněním tohoto parametru snadno přesvědčit ( buď přímo na této tabulce anebo
na tabulce ASCII2.html
[3] ).
Nejzřejmější je asi situace, kdy WWW-klient umožňuje zvolit si kód, v němž
jsou ve druhé polovině tabulky ( za ASCII-1 ) umístěny třeba znaky azbuky
- ISO-8859-5 , Windows-1251 . ( To často umožňují instalace WWW-klienta, jako
je prohlížeč Internet Explorer, viz jeho parametr "Jazyk".)
Asi nejpečlivěji vytvořené a definované jsou pro českou diakritiku tabulky
označované jako Latin2 . Kódy Latin2 obsahují kromě české diakritiky
znaky latinky používané v jazycích ve východní a střední Evropě. V prostředí
systému Unix se používá ISO-Latin2 , registrovaná
jako ISO-8859-2 . Podstatně jinak jsou obdobné znaky s diakritikou rozmístěny
v PC-Latin2 , registrované pod označením CP852 a
používané v prostředí MS-DOSu. Umístění jednotlivých znaků je uvedeno
v následujících tabulkách, v nichž jsou znaky s diakritikou symbolicky
vyjádřeny pomocí (dvou) znaků ASCII-1 . Obsah tabulek tak není odvislý od
prostředí WWW-klienta a jeho interpretačního kódu ( jako je tomu u tabulky
ASCII-2 ).
ISO-8859-2 ( tabulka všech textových znaků )
(ISO-Latin2)
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 @ P ` p nbsp Dg R' D/ r' d/ 1 ! 1 A Q a q A; a; Á A' N' á a' n' 2 " 2 B R b r ( ; A> Ň N< a> ň n< 3 # 3 C S c s L/ l/ A( Ó O' a( ó o' 4 $ 4 D T d t Cu ' A: O> a: o> 5 % 5 E U e u L< l< L' O" l' o" 6 & 6 F V f v S' s' C' O: c' o: 7 ' 7 G W g w Se < C, _* c, _: 8 ( 8 H X h x : , Č C< Ř R< č c< ř r< 9 ) 9 I Y i y Š S< š s< É E' Ů U0 é e' ů u0 A * : J Z j z S, s, E; Ú U' e; ú u' B + ; K [ k { Ť T< ť t< E: U" e: u" C , < L \ l | Z' z' Ě E< U: ě e< u: D - = M ] m } -shy " Í I' Ý Y' í i' ý y' E . > N ^ n ~ Ž Z< ž z< I> T, i> t, F / ? O _ o Z. z. Ď D< ss ď d< .
CP852 ( tabulka bez řídících znaků )nbsp .. no-break space, nejlepší překlad by asi byl tvrdá mezera
(PC-Latin2)
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 @ P ` p C, É E' á a' .S ur d/ Ó O' -shy 1 ! 1 A Q a q u: L' í i' :S uh D/ ss " 2 " 2 B R b r é e' l' ó o' ?S dh Ď D< O> , 3 # 3 C S c s a> o> ú u' vv vr E: N' < 4 $ 4 D T d t a: o: A; vl hh ď d< n' ( 5 % 5 E U e u ů u0 L< a; Á A' vh Ň N< ň n< Se 6 & 6 F V f v c' l< Ž Z< A> A( Í I' Š S< _: 7 ' 7 G W g w c, S' ž z< Ě E< a( I> š s< ; 8 ( 8 H X h x l/ s' E; S, UR ě e< R' Dg 9 ) 9 I Y i y e: O: e; VL DR ul Ú U' : A * : J Z j z O" U: VV UH dr r' . B + ; K [ k { o" Ť T< z' LD DH FB U" u" C , < L \ l | i> ť t< Č C< UL VR LB ý y' Ř R< D - = M ] m } Z' L/ s, Z. HH T, Ý Y' ř r< E . > N ^ n ~ A: _* << z. VH Ů U0 t, fS F / ? O _ o C' č c< >> dl Cu TB ' nbsp
Vysvětlivky:
V tabulkách je použit mnemotechnický zápis znaků s různými diakritickými znaménky podle RFC1345 [4]. Jde o jednoduchou konvenci, podle níž se á vyjádří jako a' , pro další diakritická znaménka jsou pak použity jiné znaky graficky podobné. Pro č se používá c< , pro ů pak u0 a pro jiné jazyky například o> je slovenské o se stříškou, : vyjadřuje německou přehlásku, analogicky , znamená ocásek u písmene, / jeho přeškrtnutí, " dlouhou přehlásku a podobně.
Pouze znaky s diakritickými znaménky používanými v češtině jsou uváděny v tabulkách ISO-8859-2 a CP852 souběžně s odpovídajícím mnemotechnickým vyjádřením. ( Důvody ke skutečnému zobrazení jen českých znaků jsou spojeny s využitelností programů pro konverzi mezi různými vnitřními kódy češtiny. Ty už někdy nepřevádějí úspěšně ani všechnu slovenskou diakritiku.) Grafickou podobu ostatních znaků je možné vidět v tabulce ASCII-2 [5], pokud se nám ji (celou) podaří zobrazit případně vytisknout v prostředí některého ze zmíněných vnitřních kódů. Tato situace ovšem přesně ilustruje nikoli tabulku onoho kódu, ale způsob, jakým je ve skutečnosti uvedený kód na tom kterém zařízení implementován. Což samozřejmě stačí pro běžnou orientaci uživatele, neboť rozdíly se u profesionálních implementací obvykle objevují jen u velmi malého počtu znaků. ( Větším problémem spíše bývá, že určité softwarové produkty mohou některé znaky zcela ignorovat. Například jen nejstarší verze textového prohlížeče Lynx neignorovaly znaky ze sloupců 8 a 9 .)
V tabulkách jsou též uváděny další zkratky, z nichž lze uvést:
Pro zjištění správného tvaru a označení kódovací tabulky je nejlepší se obrátit na Internet Assigned Numbers Authority, zkráceně IANA [6]. A tam by také měly být nové tabulky ( či jejich nové značení ) zaregistrovány. ( Jak také zmiňuje RFC1521 [7], popisující způsob přenosu jiných než textových informací v ASCII-1 pomocí E-mailu , tedy například úplného českého textu.) Ještě nedávno měla IANA všechny odkazy na ISI.EDU ( Information Sciences Institute ) v Kalifornii, s nímž ji spojovaly i mnohé personální kontakty. Na FTP.ISI.EDU [8] je také veden přehled registrovaných tabulek kódů a též E-mailové kontakty pro aktualizaci registrací jsou ve všech případech směřovány na ISI.EDU . Obě (naše) tabulky Latin2 jsou zde registrovány a měly by se označovat tak, jak je uváděno první pojmenování v tomto textu nad schématy tabulek. Nejen pro tyto tabulky, ale i pro většinu ostatních se v přehledu odkazuje na RFC-dokumenty ( nejčastěji na již zmiňované RFC1345 [4] ) anebo na jiné veřejně dostupné materiály, z nichž lze zjistit význam jednotlivých znaků a jejich umístění v tabulce.
Možná, že se nezdá příliš důležité, aby se někde dalo zjistit, jak ta či ona tabulka vypadá. Implicitně totiž vycházíme z představy, že všechny počítače v Internetu používají vlastní vnitřní kód, který pouze nějak rozšířil ASCII-1 . A pokud se vyhneme komponentám, které by nám nulovaly první bit, stačí pouze znaky z druhé poloviny ASCII-tabulky správně uživateli interpretovat na obrazovce. Tato představa je v zásadě správná a také se u nás asi nejsnadněji čeština s diakritikou právě takto implementuje. Mnohdy bohužel tak, že modul pro správné zobrazení (interpretaci) na obrazovce si koncový uživatel musí sehnat sám. Správce systémů v České republice lze v tomto směru ocenit jedině za to, že s tímto ohledem vybírají obvykle k instalaci takový software, ve kterém by žádné komponenty nenulovaly bezdůvodně první bit.
Je potřeba ale vyřešit i situaci, že některý počítač pracuje ve zcela jiném
vlastním kódu, například v kódu EBCDIC [9].
Potom se musí vždy ( podle nějaké konverzní tabulky ) převádět každý znak
( včetně ASCII-1 ) na jinou bitovou kombinaci vlastního vnitřního kódu.
A to si už zpravidla těžko může udělat uživatel ve svém (posledním) programovém
modulu a změněná konverzní tabulka je buď použita pro celou instalaci
internetového přístupu, anebo musí být více variant například příkazu TELNET
pro různé kódy. V tomto případě je jasně patrné, jak by bylo výhodné, kdyby
u nás existoval jeden jednoznačně preferovaný
kód češtiny. Potom by stačilo na každém počítači
připojeném do Internetu zajistit jednu konverzi mezi tímto kódem
češtiny a vlastním prostředím. ( V nejhorším případě by se daly bitové
kombinace znaků s diakritikou převádět na kombinace odpovídající znakům
bez diakritického znaménka, aby byly pro uživatele informace v češtině
alespoň čitelné.)
Snad jen poznámka, jak se situace řeší nyní na počítačích pracujících ve
zcela odlišném kódu. Konverzní tabulka je udělána tak, že převádí nejen
znaky z první poloviny ASCII-tabulky, ale shodně převádí i znaky z její druhé
poloviny do vlastního kódu zmiňovaného počítače. Algoritmicky tedy můžeme
říci, že nejprve se nuluje první bit a pak se použije konverze pro 7-bitovou
kompatibilitu.
Sjednotit kódování češtiny se alespoň pokusil Státní informační systém, který ve svých Standardech [10] preferuje kód ISO-Latin2, správně by tedy mělo býti uvedeno ISO-8859-2 . Pro vnitřní potřebu připouští použití i CP852 , tj. PC-Latin2 a pro WWW-stránky i Windows-1250 ( viz dále[11] ). Vzhledem k tomu, že Státní informační systém je pořád ve stadiu vývoje, je otázkou, jak se tato velmi dobrá myšlenka jistého sjednocení kódů, dokonce na variantu preferovanou v internetových dokumentech, bude vyvíjet dál.
Ještě dva další kódy češtiny jsou u nás značně rozšířeny: již zmíněný kód
Windows-1250 používaný ve Windows od Microsoftu a pak
kód bratří Kamenických pro MS-DOS. Tento ještě zcela nedávno určitě
nejznámější kód češtiny pro osobní počítače byl vytvořen v souvislosti
s prvními osobními počítači u nás, které nejčastěji používaly kód CP437, v němž
byl začátek druhé poloviny ASCII-tabulky využit pro některé znaky s diakritikou
používanou ve francouzštině, a dále se objevovaly lomené čáry, řecká písmena
a některé matematické symboly. Tento kód vytvořený bratry Kamenickými
využíval ty znaky CP437, které patřily do české diakritiky, a chybějící
znaky s českou diakritikou umístil do takových míst tabulky CP437, kde
se vyskytovaly znaky české diakritice trochu podobné. Když tedy někdo neměl
k dispozici program pro správné zobrazení češtiny v kódu Kamenický,
vypadal text v CP437 alespoň trochu graficky češtině podobný. Proto
býval v MS-DOSu tak oblíbeným.
Kód bratří Kamenických ale nebyl pro použití v Internetu zaregistrován.
Všechny znaky české diakritiky jsou v něm umístěny ve sloupcích:
8 , 9 , A . Ve zbývajících sloupcích mají (snad) být umístěny znaky CP437,
kódu pro osobní počítače IBM. Mnohé implementace však přepisovaly
pouze obsah oněch sloupců 8, 9 a A , ve zbývající části se potom mohly
objevit rozdílné znaky, to podle toho, jaký kód byl instalován původně.
Kód Kamenický
(CP895, KeybCS2)
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 @ P ` p Č É á . . . . . 1 ! 1 A Q a q ž í . . . . . 2 " 2 B R b r é Ž ó . . . . . 3 # 3 C S c s ď ú . . . . . 4 $ 4 D T d t ň . . . . . 5 % 5 E U e u Ď Ó Ň . . . . . 6 & 6 F V f v Ť ů Ů . . . . . 7 ' 7 G W g w č Ú . . . . . 8 ( 8 H X h x ě ý š . . . . . 9 ) 9 I Y i y Ě ř . . . . . A * : J Z j z . . . . . B + ; K [ k { Í Š . . . . . C , < L \ l | . . . . . D - = M ] m } Ý . . . . . E . > N ^ n ~ Ř . . . . . F / ? O _ o Á ť . . . . .
Jen české znaky s diakritikou jsou uvedeny v této a následující tabulce,
jejich umístění jest totiž nepochybné. Nejpodivnější, co do vzniku a tvaru,
je tabulka kódu češtiny pro MS-Windows. Až na malé a velké
ž, š, ť je
totiž pro češtinu shodná s ISO-8859-2 [12].
Tato tři malá a velká česká písmena jsou v následující tabulce umístěna
( z hlediska Internetu ) v nevhodných sloupcích 8 , 9 . Kromě oněch tří
českých písmen jsou ještě v jiných místech než v ISO-8859-2 umístěny:
z s čárkou [ z, ] , s s čárkou [ s, ], l s háčkem [ l< ] , a s dlouhým
ocáskem [ a; ] a pak snad ještě pro češtinu využitelný znak samotného
háčku, ten je v pozici 'A1' ( oproti 'B7' v ISO-Latin2 ). Ale shodně je na
'B4' umístěn znak samotné čárky a také znaky z s tečkou [ z. ] ,
s s ocáskem [ s, ] zůstaly umístěny na stejných pozicích jako v ISO-Latin2.
Odlišnosti jsou ještě v některých zvláštních znacích, čehož si lze
při konverzích WWW-stránek nejčastěji všimnout u znaku (C)
[ Co = Copyright sign ]. Ten je v tabulce MS-Windows češtiny
v pozici 'A9' ( což se shoduje s ISO-8859-1 alias ISO-Latin1 ), ale úplně
chybí v ISO-8859-2. Každému se jistě zdá, že takovéto odlišnosti se musejí
dát poměrně snadno jednoduchým konverzním programem nějak překonat, pokud
již "počešťovatelé" MS-Windows nebyli z nějakého důvodu schopni implementovat
přesně onu tabulku ISO-8859-2 preferovanou v dokumentech Internetu. Proč ovšem
k takto nepříliš šťastně počeštěnému prostředí MS-Windows není k dispozici
firemní konverzní program, to už lze vysvětlit snad jedině nezájmem tvůrců
o kompatibilitu češtiny v prostředí Internetu.
Windows-1250
( CP1250 )
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 @ P ` p 1 ! 1 A Q a q Á á 2 " 2 B R b r Ň ň 3 # 3 C S c s Ó ó 4 $ 4 D T d t 5 % 5 E U e u 6 & 6 F V f v 7 ' 7 G W g w 8 ( 8 H X h x Č Ř č ř 9 ) 9 I Y i y É Ů é ů A * : J Z j z Š š Ú ú B + ; K [ k { C , < L \ l | Ě ě D - = M ] m } Ť ť Í Ý í ý E . > N ^ n ~ Ž ž F / ? O _ o Ď ď
Tato tabulka se začala nazývat CP1250 , její nejpravděpodobnější tvar je
možno obdržet faxem od českého zastoupení Microsoftu a je v něm právě takto
pojmenována. Umístění nečeských znaků a samotných diakritických znamének
se dá z takovéto grafické podoby tabulky spíše jen odhadnout. Tabulka je sice
v IANA registrována, ale nikoliv s odkazem na její přesný popis, jako je
tomu třeba ve zmiňovaných RFC-dokumenech, ale s odkazem na dopis od
Jekatěriny Lažincevy
[13] z května
roku 1996, ve kterém je tabulka označena jako
Windows-1250. Zda se jedná o tabulku shodnou skutečně ve všech
pozicích ( jako např. v '81' či '98' ) , to se asi nedá zjistit ani
u zastoupení Microsoftu ani E-mailem odesílateli onoho dopisu. ( Je ale
pravda, že jsem dopis nepsal v kódu Windows-1251 !)
Poznámka: Celá tabulka vypadá nejspíše tak, jak je uvedeno na
ftp.unicode.org [14].
Oba tyto problémy v minulosti vytvořená koncepce Internetu nijak neřešila a i v současnosti jsou tyto otázky řešeny jen u některých internetových funkcí. Proto mnohdy nezbývá než, aby uživatel sám poznal či odhadl, jaký kód je na cílovém počítači používán, anebo jinak, jak lze mezi sebou rozpoznat ony čtyři nejběžnější tabulky kódování češtiny. Stačí si vybrat nějaké vhodné písmeno české diakritiky a zapamatovat si, kde je v které tabulce umístěno.
Vhodným písmenem je naše české ř . V tabulkách
ISO-8859-2 a Windows-1250 je umístěno stejně, přibližně uprostřed posledního
sloupce na 'F8'. V tabulce CP852 je malé ř skoro až na konci,
v pozici 'FD' , hned u velkého Ř ( 'FC' ). I když se tabulky
mohou v některých dokumentech objevovat diagonálně převrácené, to znamená,
že by řádky ( opačně od tohoto textu ) uváděly první půlbyte a sloupce pak
odpovídaly hodnotě druhého půlbytu, bude v každém z těchto tří kódů malé
ř umístěno na okraji tabulky. Jedině v kódu Kamenický
je malé ř někde uvnitř tabulky -- 'A9' . Kód Kamenický
se kromě toho snadno pozná tím, že všechny české znaky jsou soustředěny do
tří sloupců ( převráceně do tří řádek ) následujících hned za první polovinou
tabulky ( za ASCII-1 ).
Zbývá ještě rozlišit tabulky Windows-1250 a ISO-8859-2. To lze podle umístění
ž, š, ť nebo podle toho, že v ISO-8859-2 nejsou v blízkosti první
poloviny tabulky vůbec žádné znaky ( ani Š a Ť,Ž ).
Za povšimnutí ještě stojí, co se stane s českou diakritikou, když se v některé komponentě vynuluje první bit. Tedy příkladně z malého ř v kódu ISO-8859-2 nebo Windows-1250, jehož bitová kombinace je `11111000` = 'F8' , se pak stane `01111000` = '78' , což je znak malé x . V kódu CP852 se ř = 'FD' změní na '7D' = } a v kódu Kamenický se ř = 'A9' změní na '29' = ) . Znak se nulováním prvního bitu vždy posouvá v tabulce do pozice o 8 sloupců menší (= vlevo ).
Z tohoto hlediska pro češtinu není příliš výhodné rozmístění znaků podle kódu ISO-8859-2, protože se skoro vždy česká diakritika změní na nějaké (zcela jiné) písmeno bez diakritiky. To je při čtení textu daleko více matoucí, než kdyby se místo toho v textu objevily číslice anebo nějaké nealfanumerické znaky. V kódu CP852 se mnohem větší počet českých znaků s diakritickými znaménky přetransformuje na nealfabetní znaky. Zdálo by se tedy, že nejvýhodněji je z tohoto pohledu udělán kód Kamenický. Bohužel tomu je právě naopak.
České znaky ze sloupců 8 , 9 se totiž nulováním prvního bitu
posouvají do řídících znaků umístěných ve sloupcích 0 , 1 , které
pak v některých internetových funkcích mohou způsobit nemalé problémy.
Proto je používání těchto znaků '8x' a '9x' věnována v Internetu určitá
opatrnost. ( Proto třeba také Lynx, pokud není připraven pro
určitý národní kód, tyto znaky nezobrazuje.)
Nejbezpečnější je z tohoto pohledu používání kódu češtiny ISO-8859-2, kde
se ve sloupcích 8, 9 nevyskytují vůbec žádné textové znaky.
Toto obecně platí pro všechny kódy ISO , v nichž se nulováním prvního
bitu mezi řídící znaky nedostane žádný textový znak. A to je právě jeden
z důvodů, proč v některých dokumentech Internetu je preferováno
používání ISO-kódů.
Při pohledu na tabulku Windows-1250 je vidět, že rozmístění české diakritiky
je v ní nevýhodné z obou pohledů. Případným nulování prvního bitu se
z š = '9A' stává (řídící) znak '1A' a z ŤŠ ,
tj. '8D''8A' , by se stalo '0D''0A' , což v mnoha systémech dává
konec řádky. Ale velké ŤŠ se takto za sebou v českém textu asi hned tak
nevyskytne, ledaže by nějaké dítě z první třídy psalo v dopise
DÉŠŤ ŤŠ.ŤŠTÍ V ŠPANĚLSKU ...
a dopis by pak mohl být při přenosu u tečky uříznut.
Přenos E-mailu je právě ta situace v Internetu, kdy se musí počítat s možností, že přenosem pomocí SMTP by mohl být první bit každého oktetu vynulován. Proto je obvykle dopis, v němž jsou uvedeny znaky z druhé poloviny ASCII-tabulky, kódován. Čeština se zpravidla kóduje tak, že text ve znacích ASCII-1 se ponechá a každý znak ASCII-2, tedy s diakritikou, je převeden na ( tři ) znaky =xy , kde xy je pozice onoho znaku v kódové tabulce, neboli jeho hexadecimální hodnota. O jakou kódovou tabulku se jedná, musí být napsáno v hlavičce dopisu. Problémem se pak stává sám znak = , pokud se vyskytne ve vlastním textu dopisu. V tomto případě se každé takové = kóduje také, a to jako =3D , neboť jeho hexadecimální hodnota je právě '3D' ( RFC1521 [7] ).
Analogický způsob se používá pro znaky ASCII-2 anebo znaky nevyhovující z jiného důvodu v URL-specifikacích ve WWW ( RFC1738 [15] ). Znaky se zde kódují jako %xy , kde xy je opět hexadecimální hodnota znaku. Pokud by v URL-specifikaci měl být použit znak % , zapíše se podle své hexadecimální hodnoty jako %25 . Problémem je, že v URL-specifikacích se nepočítá s uváděním kódové tabulky. Podle tvůrců WWW se má implicitně předpokládat, že se vše vztahuje ke kódu ISO-8859-1. Zvláště u nás se ovšem předpokládá takový kód, jaký předpokládá správce WWW-serveru, lépe řečeno právě ten kód, v němž pracuje WWW-server.
Pokud na druhou stranu lze uvažovat, že se v internetové funkci dá vyhnout
eventuálnímu nulování prvního bitu, přenáší se pak český text v určitém kódu
nikterak nezměněný až k uživateli. To je, jak již bylo zmíněno výše, nejčastější
způsob přenosu české diakritiky v Internetu, hlavně v interaktivních funkcích
typu TELNET, Gopher, WWW. V tomto případě je potřeba, aby uživatel byl
schopen češtinu správně interpretovat z takového kódu, ve kterém k němu
přichází. Buď si musí nějak zajistit stejný vlastní (vnitřní) kód anebo
používat vhodný překódovávací program. Speciálně u WWW-serverů se však u nás
rozšířily i programové nadstavby, kdy WWW-server stránku ještě sám překóduje
do kódu, v němž ji pro správnou interpretaci potřebuje právě získat koncový
uživatel.
V tomto kontextu je třeba ještě poznamenat, že kód, kterým je čeština nakonec interpretována uživateli, nemusí přesně odpovídat určité (stanovené) kódové tabulce. Tabulka někdy bývá rozšířena tak, aby se správně interpretovala ( pokud možno ) většina českých znaků i z některého jiného kódu. Tak například WWW-prohlížeč Arachne interpretuje (zobrazuje) kromě kódu ISO-8859-2 ještě velkou část kódu Kamenický. ( Jejich tabulky se překrývají jen ve sloupci A .)
Lepším příkladem jsou vlastní fonty ve známém WWW-prohlížeči Netscape , ve kterých lze vybrat i variantu, kde je současně interpretována správně čeština v kódu ISO-8859-2 i Windows-1250. Rozdílně umístěné české znaky jsou totiž ve sloupcích zcela disjunktních. Jako malé š je možno interpretovat jak hodnotu 'B9' tak i '9A' . A analogicky je tomu pro Š a taktéž ť, Ť, ž, Ž .
A obdobně lze i v aplikačním programovém vybavení třeba na WWW-serveru řešit onu trochu zvláštní odlišnost kódu Windows-1250 od kódu ISO-8859-2. Tak jako se v určitých aplikacích malá a velká písmena z příkazů zadání převádějí na jednotný tvar, je možno například '9A' i 'B9' převádět na stejnou hodnotu odpovídající š . Ve WebALEPHu [16] implementovaném v Národní knihovně v Praze má stejný význam ( jako š ) kterákoliv z hodnot '8A' , '9A' , 'A9' , 'B9' . Je nakonec možné, že takovýto pseudokód "ISO-Latin-1250" umožní nějakým způsobem (uživatelsky) překlenout problematiku jednoho preferovaného kódu češtiny.