Nahlédněte i do Diskuse pod čarou!

Multipurpose Internet Mail Extensions

MIME je standardizovaný způsob označování obsahu zpráv, v praxi především elektronických dopisů (protokol SMTP) a dokumentů WWW (protokol HTTP). Nejnovější definici MIME lze nalézt v RFC 2045 až 2049.

Z hlediska problematiky kódování češtiny na Internetu jsou ze standardu MIME nejdůležitější tato pole v hlavičce elektronického dopisu nebo v úvodu HTTP protokolu:

Content-type: typ/podtyp; charset=znaková_sada
Udává formát obsahu dokumentu - v případě dopisů je to nejčastěji text/plain, na WWW pak text/html, umí však specifikovat i obrázky, zvuky ap. (např. image/gif, image/jpeg ap.) - a dále název znakové sady obsažené (textové) informace.
Content-transfer-encoding: typ_přenosového_kódu
Udává, zda je informace přenášena sedmibitově (7bit), osmibitově s členěním na řádky (8bit) nebo bez tohoto členění jako proud osmibitových dat (binary), nebo říká, že se informace sice přenášena na sedmi bitech, ale že její vlastní obsah všech osm bitů obsahuje (quoted-printable nebo base64, podle způsobu přepisu osmibitových znaků na sedmibitové - blíže zde).
Pro HTTP není způsob přenosu již tak zajímavý, jako pro elektronickou poštu, protože HTTP je osmibitově prostupný bez problémů. (Starší SMTP servery však nikoli - viz Jak odesílat české dopisy.)
Content-language: označení_jazyka
Tahle hlavička říká, v jakém jazyce je stránka psána. Níže naleznete informaci o označení češtiny (není totiž jednoznačné, jako obvykle).
Accept-language: označení_oblíbených_jazyků
V této řádce může klientský program požádat o nějaký konkrétní jazyk, nebo sdělit serveru seznam svých preferovaných jazyků (vč. udání pořadí). Níže naleznete informaci o označení češtiny (není totiž jednoznačné, jako obvykle). A ještě níže naleznete popis možnosti, jak tuto hlavičku využít i pro označení oblíbené znakové sady, pokud klientský program nedovoluje nastavit Accept-charset.
Přesná syntaxe tohoto pokynu však může být poměrně složitá, např:
Accept-language: cz, sk;q=0.9, de;q=0.3, en;q=0.7
říká: "Nejradši bych to česky, pak slovensky, ze 70 % bych tomu rozuměl i anglicky, no a nepůjde-li jinak, spokojím se snad i s němčinou." (Všimněte si, že se ani pořadí preferovanosti nemusí shodovat s pořadím v seznamu.)
Accept-charset: označení_oblíbených_znakových_sad
Touto hlavičkou může opět klientský program žádat o určité kódování nebo opět předat seznam kódování, která umí rozluštit. Na tuto hlavičku reagují většinou moduly nebo CGI-skripty překládající WWW stránky pro klienta za letu.
Opět je možná stejně složitá prosba jako v Accept-language.
Cíl řádného značení podle MIME je zřejmý - adresát musí být schopen informaci ze zprávy vyluštit bez ohledu na to, jakou formou byla v Internetu přenášena. Naprostá většina programů pro Internet se standardu MIME drží, v čem tedy je problém?

Povolené (definované) znakové sady

Starší definice MIME (v RFC 1521) definovala tato kódování (na velikosti písmen nezáleží):

Všechna další kódování, která se mohou používat v MIME, musí být zaregistrována u IANA (pro soukromé účely lze použít i neregistrované kódování, ovšem s povinnou předponou x-). Příslušnou registraci, obsahující všechny registrované alternativy jmen, najdete také u popisu každého kódování ve zdejším seznamu kódování. Pokud je to jen trochu možné, používejte:

Nejčastěji používané názvy pro české znakové sady

Je vidět, že každá platforma má tendenci zaregistrovat si vlastní znakovou sadu a takto "posvěceným" kódováním rozesílat informace do světa. (Nejvíce je tento trend patrný v aktivitách firmy Microsoft, jejíž windows-1250 se bohužel zdá získávat hlavní podíl na českých WWW stránkách.) V zásadě je takové chování korektní - každý si přece může přečíst definici daného kódování a naučit se ho číst. Tento postup však nutí klienty i servery k přidávání nových a nových kódování, ačkoli ta, která už umějí, pro přenášení češtiny postačují.

Domnívám se, že výhodnost situace, kdy by byla v celém českém Internetu používána jedna znaková sada, je zřejmá - servery WWW stránek by nemusely provádět žádná přizpůsobovací opatření "za letu" ani plýtvat diskové kapacity několika verzemi těchže dokumentů, v elektronické poště by mohl každý uživatel bez obav používat háčkovanou češtinu a toto by platilo i o elektronických konferencích ap. Nechci být špatně pochopen - respektuji rozdílné standardy jednotlivých platforem osobních počítačů (windows-1250 v případě Windows, apple-ce v případě Macintoshe, kódování bří. Kamenických v případě DOSu), chtěl bych jen, aby všechny informace na Internetu (a především ve veřejné doméně) používaly standard jen jeden. V praxi je tento požadavek řešitelný poměrně snadno - všechny uživatelské komunikační programy budou vybaveny převodními tabulkami z vlastního kódování do "kódování sítě" a naopak. Většina současných programů tyto převody provádí tak jako tak.

Chtěl bych tímto apelovat jak na výrobce komunikačních programů, tak na jejich uživatele, aby se snažili zbytečnému tříštění standardů pro dílčí platformy zamezit a usilovali o jednotné kódování, které vyhovuje všem. Takové kódování totiž už dávno existuje. Je jím ISO-8859-2.

Proč právě ISO-8859-2!?

Označení jazyka češtiny

Nedávno se na toto téma objevilo několik příspěvků v diskusi CSINFO-L a ukázalo se, že i v označování češtiny vládne zmatek a nejednotnost. Naštěstí není situace tak vyhrocená, jako v případě poskytování různých kódování (není třeba přidávat speciální programy nebo konverzní tabulky, pro každé nové jméno stačí řádka v konfiguraci klienta a řádka v konfiguraci serveru), ale i přesto pokládám za vhodné snažit se chaosu zabránit co nejdříve.

Norma HTTP, která charakterizuje řádky Content-language a Accept-language, se nijak blíže nevěnuje tomu, jak jazyk pojmenovat. Může zde být libovolný řetězec. Jestliže má však pole Accept-language umožnit klientu požádat o nějakou mutaci stránky, musí server logicky tuto mutaci nazývat stejně (a podobně s Content-language).

Např. Netscape uživateli při konfiguraci oblíbených jazyků nabízí řetězce typu English [en], British English [en-GB], Deutsch [de]. Dvoupísmenná zkratka přitom obvykle pro určení jazyka stačí a předpokládám, že ji server vyhledává v řetězci přednostně.

Pro češtinu je normou ISO 639 dána dvoupísmenná zkratka "cs". Například modul p. Lampy však doporučuje pro označení češtiny zkratku "cz". (Zřejmě došlo k záměně s kódem České republiky, který je podle normy ISO 3166 skutečně "CZ", píše se však velkými písmeny a nehovoří o jazyce.)

Jak jsem již říkal, stačí jedna řádka v konfiguraci a budou fungovat obě zkratky, přesto se domnívám, že "cs" je normou větší a snad i více používanou a bylo by dobře držet se spíše jí. (Ostatně novější verze prohlížečů češtinu ve svých předvolbách pod zkratkou "cs" již nabízejí.)

Využití označení jazyka i k specifikaci použitého kódování

Zajímavou možností určení kódování je rozšíření názvu jazyka (především v požadavku od klienta - "chci to česky v Kamenických"). Jen velmi málo prohlížečů totiž dovoluje nastavit volbu Accept-charset, ale mnohé dovolují i ruční nastavení Accept-language.

Zavádění tohoto způsobu požadavku o konkrétní znakovou sadu však v současné době nedoporučuji, domnívám se, že je vhodnější počkat, až se užívání Accept-charset rozšíří. Nechcete-li čekat, čtěte dále.

Podle informace Vladimíra Solnického existuje standardizovaný způsob, jak název jazyka pro tento účel "zpotvořit":

jj [ "_" ZZ [ "." kód ] ]
jj
označení jazyka (pro češtinu doporučuji cs, viz výše)
ZZ
označení země (pro Českou republiky CZ)
kód
název znakové sady, v níž je dokument napsán (doporučuji název podle MIME)

Neumím posoudit, jak moc je tento způsob standardní, nevím ani, v jaké normě se objevil, pokud vůbec v nějaké. HP-UX 10.x používá pro češtinu např. označení cz_CZ.iso88592, což porušuje oblíbený kód jazyka cs a rovněž MIME název znakové sady ISO-8859-2. Netscape 2.0 pro Maca se zase liší v konvenci oddělovače kódu jazyka a země (používá en-GB pro angličtinu). Czech plug-in Ladislava Popova zase reaguje na označení typu Czech/CP1250[cz]. Takže je vidět, že zbytečnému zmatku se nevyhneme ani zde.

Na závěr tedy ještě jedno doporučení (moje osobní, ale bude-li nás víc, ... :-), jak Accept-charset pro češtinu zapisovat:

(Soudím, že kód země je v označení českého jazyka irelevantní - česky se přece mluví všude - a spojovník je hezčí písmenko než podtržítko. :-)

Diskuse pod čarou je vám k dispozici - prozraďte, co je vám a vašim programům nejbližší, ať se o tom ví a lze tuto cestu používat co nejefektivněji, než konečně zmizí do propadliště dějin, smetena rozšířením hlavičky Accept-charset. [Počitadlo] od 5. 6. 1997