Kódování češtiny



7-bitová kompatibilita Internetu


V souvislosti s problémy, které se při přenosu českého textu po Internetu občas objevují, se mnohdy obecně poukazuje na sedmibitovost sítě Internet. To může vyvolat rozporuplné představy s tím, jak se v předchozí kapitole stále hovořilo o přenášení oktetů. Pro vysvětlení se musíme vrátit zpátky do období vzniku Internetu.

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ů )

 01234567 89ABCDEF
0    0@P`p         
1   !1AQaq         
2   "2BRbr         
3   #3CScs         
4   $4DTdt         
5   %5EUeu         
6   &6FVfv         
7   '7GWgw         
8   (8HXhx         
9   )9IYiy         
A   *:JZjz         
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 )

 01234567 89ABCDEF
0      &-      {}\0
1       /  aj~ AJ 1
2          bks BKS2
3          clt CLT3
4          dmu DMU4
5          env ENV5
6          fow FOW6
7          gpx GPX7
8          hqy HQY8
9        ` irz IRZ9
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].





Tabulky kódování češtiny


V češtině se používá latinka s diakritickými znaménky. Kdybychom v minulém století přistupovali k pravidlům českého pravopisu méně schematicky ( a více foneticky ) , mohli bychom mít nyní vyřešeny problémy s češtinou v Internetu.  Hlavním problémem je v češtině  e  a fonetická změna předchozí hlásky pro  ě . Pokud bychom místo háčku nad e  psali diakritické znaménko nad hlásku předcházející, tady například  ďe , ťe , ňe  namísto  dě , tě , ně , stačilo by potom vždy jen rozlišit písmeno s diakritickým znaménkem anebo bez znaménka. Tím bychom mohli v Internetu používat jednu logicky vytvořenou tabulku pro českou diakritiku - bitová kombinace odpovídajícího písmene latinky v ASCII-1 ovšem s prvním bitem naplněným jedničkou. ( S problémem  ů  foneticky v nynější době ekvivalentním  ú  bychom se už nějak smířili - asi jako se situací, že i všechny české editory ponechávají na konci řádky samotné předložky typu: k, s, v .)

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ů )

 01234567 8 9ABCDEF
0    0@P`p  €  °ŔĐŕđ
1   !1AQaq   ‘ĄąÁŃáń
2   "2BRbr  ‚ ’˘˛ÂŇâň
3   #3CScs  ƒ “ŁłĂÓăó
4   $4DTdt  „ ”¤´ÄÔäô
5   %5EUeu  … •ĽľĹŐĺő
6   &6FVfv  † –ŚśĆÖćö
7   '7GWgw  ‡ —§ˇÇ×ç÷
8   (8HXhx  ˆ ˜¨¸ČŘčř
9   )9IYiy  ‰ ™ŠšÉŮéů
A   *:JZjz  Š šŞşĘÚęú
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)

 01234567   8  9   A   B   C   D   E   F  
0    0@P`p         nbsp  Dg  R'  D/  r'  d/
1   !1AQaq           A;  a;Á A'  N'á a'  n'
2   "2BRbr            (   ;  A>Ň N<  a>ň n<
3   #3CScs           L/  l/  A(Ó O'  a(ó o'
4   $4DTdt           Cu   '  A:  O>  a:  o>
5   %5EUeu           L<  l<  L'  O"  l'  o"
6   &6FVfv           S'  s'  C'  O:  c'  o:
7   '7GWgw           Se   <  C,  _*  c,  _:
8   (8HXhx            :   ,Č C<Ř R<č c<ř r<
9   )9IYiy         Š S<š s<É E'Ů U0é e'ů u0
A   *:JZjz           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ů )
(PC-Latin2)

 01234567   8   9   A   B   C   D   E   F  
0    0@P`p    C,É E'á a'  .S  ur  d/Ó O'-shy
1   !1AQaq    u:  L'í i'  :S  uh  D/  ss   "
2   "2BRbr  é e'  l'ó o'  ?S  dhĎ D<  O>   ,
3   #3CScs    a>  o>ú u'  vv  vr  E:  N'   <
4   $4DTdt    a:  o:  A;  vl  hhď d<  n'   (
5   %5EUeu  ů u0  L<  a;Á A'  vhŇ N<ň n<  Se
6   &6FVfv    c'  l<Ž Z<  A>  A(Í I'Š S<  _:
7   '7GWgw    c,  S'ž z<Ě E<  a(  I>š s<   ;
8   (8HXhx    l/  s'  E;  S,  URě e<  R'  Dg
9   )9IYiy    e:  O:  e;  VL  DR  ulÚ U'   :
A   *:JZjz    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:

nbsp   ..   no-break space, nejlepší překlad by asi byl tvrdá mezera
-shy   ..   soft hyphen, lépe než měkká pomlčka je pomlčka oddělující
_*     ..   znak pro násobení, tedy "krát"
_:     ..   znak pro dělení
Dg     ..   znak stupně  ( Degree sign )
Cu     ..   znak měny  ( Currency sign )
Se     ..   paragraf   ( Section sign )
ss     ..   německé ostré  s , "scharfes s"
.S,:S,?S, ..   znaky podle CP852 pro tečkované, čárkované, tučné vyplnění prostoru  (stín)
ur,UR,uh,UH, ..   v tabulce CP852 symbolizuje znaky využívané k zobrazení čar a jejich vzájemného napojení, pro dvojité čáry je totéž symbolizováno velkými písmeny


Pokud má být v Internetu zajištěna kompatibilita nějaké funkce, při které se používají i jiné textové znaky než ASCII-1, tedy například znaky s českou diakritikou, musí být znám použitý kód. Tedy konkrétně význam všech možných používaných bitových kombinací. Pochopitelně je třeba dát pozor na to, aby se k činnosti funkce využívaly vždy jen komponenty, které žádnou z možných bitových kombinací nikterak nemodifikují, hlavně tedy nejsou naprogramovány či nakonfigurovány tak, že by mohly nulovat první bit oktetu ( v okamžiku, kdy je tato informace nezbytná ).

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)

 01234567  8 9 A  B C D E F 
0    0@P`p  Č É á   . . . . .
1   !1AQaq    ž í   . . . . .
2   "2BRbr  é Ž ó   . . . . .
3   #3CScs  ď   ú   . . . . .
4   $4DTdt      ň   . . . . .
5   %5EUeu  Ď Ó Ň   . . . . .
6   &6FVfv  Ť ů Ů   . . . . .
7   '7GWgw  č Ú     . . . . .
8   (8HXhx  ě ý š   . . . . .
9   )9IYiy  Ě   ř   . . . . .
A   *:JZjz          . . . . .
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 )

 01234567  8 9 A  B C D E F 
0    0@P`p                  
1   !1AQaq          Á   á   
2   "2BRbr            Ň   ň 
3   #3CScs            Ó   ó 
4   $4DTdt                  
5   %5EUeu                  
6   &6FVfv                  
7   '7GWgw                  
8   (8HXhx          Č Ř č ř 
9   )9IYiy          É Ů é ů 
A   *:JZjz  Š š       Ú   ú 
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].





Přenos češtiny v síti Internet


Přenášení českého textu je po Internetu principiálně možné, neboť se každý znak přenáší jako oktet. Problémy, které se při tom objevují, vznikají ze dvou hlavních důvodů. Zaprvé je třeba zprostředkovat nějakým způsobem informaci o použitém kódu češtiny a zadruhé je potřeba se vyhnout implicitně uvažované (pouze) sedmibitové kompatibilitě Internetu, tedy aby nebyly použity takové programové komponenty, které první bit nulují.

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.




Odkazy
 
[1]  kap4.htm#ASCII-1
[2]  ftp://pub.vse.cz/pub/docs/rfc/rfc821.txt
[3]  http://146.102.64.30/kizi/information/ASCII2.html
[4]  ftp://pub.vse.cz/pub/docs/rfc/rfc1345.txt
[5]  kap4.htm#ASCII-2
[6]  http://www.iana.org/numbers.html
[7]  ftp://pub.vse.cz/pub/docs/rfc/rfc1521.txt
[8]  ftp://FTP.ISI.EDU/in-notes/iana/assignments/character-sets
[9]  kap4.htm#EBCDIC
[10http://library.vse.cz/cgi-bin/k6?ST=01&L=00&KOD=00&JAK=L&KDE=016&RET=standardy+st&PZ=04
[11kap4.htm#Windows-1250
[12kap4.htm#ISO-8859-2
[13ftp://FTP.ISI.EDU/in-notes/iana/assignments/character-set-info/windows-1250
[14ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT
[15ftp://pub.vse.cz/pub/docs/rfc/rfc1738.txt
[16http://omega.nkp.cz:4001/ALEPH/CZE/NKC/NKC/NKC/FIND-LIST?