Filipika proti META HTTP-Equiv

Na českém Webu často vídáme webové stránky obsahující element <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">. Myslím si, že tento způsob informování o kódování znaků je poněkud nešťastný a navíc balancující na hranici korektnosti a že by se mu soudný webmaster měl vyhýbat. Zkusím vysvětlit, proč:

Předně: Tato informace je redundantní – podle standardu HTTP (RFC 2616) musí Content-Type posílaný HTTP serverem obsahovat informaci o znakové sadě, leda že by dokument byl kódován v iso-8859-1 (případně US-ASCII, které je jeho podmnožinou). Takže META tagu nezbývá, než zopakovat to, co už klient jednou viděl.

To samo o sobě není důvod k tomu META tagy nepoužívat, někdy dovedou být užitečné, pokud se rozhodnete webovou stránku uložit na disk a později se k ní vrátit. Tehdy už prohlížeč nezná HTTP hlavičku a META tag je jediné místo, kde se lze kódování dozvědět. Jenže ona to není jediná věc, která prohlížeči schází – pokud třeba stránka obsahuje relativní odkazy, je nutné znát i původní URL. Některé prohlížeče to (docela rozumně) řeší tím, že prostě při ukládání všechny externí informace do textu stránky samy přidají.

Za další: Informace o znakové sadě musí být nutně externí, jelikož aby HTML parser objevil, že se v dokumentu vyskytuje nějaký tag META, musí nejdříve vědět, jak vypadají znaky. U iso-8859-2 nebo windows-1250 to samozřejmě není nijak vážné, protože se dá snadno zařídit, aby před elementem určujícím kódování byly pouze znaky z ASCII, ale představte si, co se stane, pokud je charset například iso-10646-ucs-2 (Unicode s 16-bitovými kódy znaků). Tento příklad krásně ukazuje, že ukládat znakovou sadu uvnitř dokumentu je naprosto nekonsistentní, leda že by ten, kdo dokument parsuje, dopředu věděl, v jaké znakové sadě je napsán :-)

Stále ještě můžete namítnout, že přidáním META tagu aspoň nemůžete nic pokazit. Chyba lávky, ještě tu totiž jsou transparentní překódovávače. Podle již zmiňovaného RFC 2616 má HTTP server (to by ještě nevadilo, ten může být pod vaši kontrolou) i HTTP proxy (což je horší) právo překódovávat, pokud správně upraví údaje v HTTP hlavičce. Sotva ale můžeme předpokládat, že takový překódovávač bude rozumět syntaxi HTML – on jenom ví, že se jedná o textový soubor (má Content-Type text/cosi) a v jakém je kódování, ovšem nijak se nestará o to, že by dovnitř někdo mohl vložit ještě jednu informaci o kódování, kterou by bylo nutné přepisovat. Je sice pravda, že některé překódovávače umí odhalit i META tag a přepsat ho, ale činí tak nad rámec svých povinností a asi je naivní se domnívat, že by to dělaly všechny. (Pravda, prohlížeč by se tím neměl nechat zmást, protože specifikace HTML 4 mu velí preferovat informaci v Content-Type, leč jakmile uložíte stránku na disk, prohráli jste.)

Tyto všechny důvody mne vedou k názoru, že informace o znakové sadě patří jen do Content-Type v HTTP hlavičce.

Pokud znáte nějaké další argumenty (ať už pro či proti), dejte mi vědět, rád je připíši.

Poznámka z 18. 11. 2005 (inspirováno diskusí na Lopuchu): META HTTP-Equiv vzniklo původně (a specifikace HTML 4 o tom tak opravdu hovoří) jako informace pro server, že má do hlavičky HTTP odpovědi příslušné informace přidat. Pokud by servery opravdu fungovaly takto a nejlépe ještě META tag smazaly, bylo by vše v nejlepším pořádku (tedy mimo zmíněné nekonsistence typu "slepice nebo vejce?", kterou lze překousnout) ... jenže, viděli jste takový server?

Stránku spravuje Martin Mareš