Diakritika na HTML stránkách.
Pokud hledáte rychlé řešení problému češtiny na svých stránkách, přeskočte dolů na automatické meta nastavení.
O problémech s českými fonty píšu na stránce o formátovacích chybách. Konkrétní znaky různých kódování lze najít v kódových tabulkách. Rozpoznat problém můžete na diagnostické stránce.
Co je kódování - Nejčastější kódování - Argumenty pro Windows-1250 - Argumenty pro ISO 8859-2 - Argumenty pro UTF-8 - Různá řešení - Nastavení v prohlížeči - Automatické meta nastavení - Překódování na serveru - Unicode - URL encoded - Speciální znaky - Překódování
Počítač chápe každé písmenko jako číslo od 0 do 255 (jeden bajt).
Američané a Angličané (a programátoři) si vystačí se 128 znaky, protože John Wicliff (britská obdoba Mistra Jana Husa) se nepletl do věcí, kterým nerozuměl, takže nemají nabodeníčka. Těmto základním 128 znakům bez háčků a čárek se říká ASCII.
Dalšími čísly od 128 do 255 se označily diakritizované znaky jazyků západní Evropy, a tak vznikl kód Latin-1. V něm české znaky nejsou (s výjimkou znaků á, í, š a ž).
Pro neazbukové jazyky střední a východní Evropy (tedy i pro češtinu a slovenštinu) vznikly různé konvence, které zachovávají význam prvních 128 znaků ASCII (normalni pismena), ale dalších 128 znaků si definují po svém. A právě různá přiřazení diakritizovaných znaků číslům od 128 do 255 se označují jako kódování (případně jako znaková sada).
Hodně různých lidí si usmyslelo, že nadefinují kódování češtiny, jenomže to každý udělal jinak.
V poslední době převládají tři kódování češtiny:
- ISO 8859-2
- Windows-1250
- UTF-8
ISO 8859-2 je, jak už název napovídá, kódování standardnější, používané na Unixu a na Linuxu, ale i v mnoha windowsáckých programech. Někdy se označuje jako Latin 2, ISO Latin 2. Microsoft jej nazývá takto: "Středoevropské jazyky (ISO)".
Windows-1250 je preferováno na Windowsech. Jeho obliba na webových stránkách spočívá zejména kvůli tomu, že jej většina editorů na Windowsech používá jako základní kódování, např. FrontPage, HomeSite nebo Notepad (poznámkový blok). V Microsoftích programech se kódování windows-1250 označuje jako "Středoevropské jazyky" bez přívlastku, což je od Microsoftu samozřejmě srabárna a matení.
Zápis UTF-8 je nejčastějším zápisem znakové sady Unicode. Unicode je narozdíl od výše zmíněných znakových sad určeno pro všechny světové jazyky najednou, protože znakům přiřazuje čísla až do 16 miliónů (zapisuje se většinou dvěma bajty). Jde o nejmodernější kódování. Všeobecná podpora Unicode je teprve hudbou budoucnosti, ale už lze bez problémů používat stránky kódované v UTF-8. UTF-8 je v prohlížečích podporované dobře.
ISO 8859-1 (též Latin-1, Západoevropské ISO) je kódování západoevropské. Neobsahuje všechny české znaky. Pokud jde o češtinu, v zásadě se jeho použití rovná chybě.
Další stará kódování jako kód bratří Kamenických, Mac, PC Latin 2 nebo čeština pro Dos se dnes již na webu užívají tak zřídka, že jim nyní nebudu věnovat pozornost.
Můžete si prostudovat kompletní grafické znázornění znaků jednotlivých kódování v tabulkách.
Nejpoužívanější kódování ISO 8859-2 a Windows 1250 se v oblasti českých znaků od sebe odlišují pouze v šesti znacích -- š, ž, ť, Š, Ž, Ť (a také blbne slovenské měkké ľ). Pro zájemce jsem napsal rozdíly kódování mezi ISO a WIN pro zapisování s altem a číslem (osobně to dost často používám).
Pokud při čtení nějaké znaky mizejí nebo přebývají, obvykle se jedná o chybu s UTF-8. (Když znaky přebývají, je kód v UTF a je zobrazován jinak. Pokud znaky chybějí, je kód v něčem jednobajtovém a chce se zobrazovat jako UTF.)
Notepad (nejjednodušší texťák, ve kterém se to nedá přepnout) používá jako výchozí kódování windows-1250 a kódování ISO-8859-2 neumí. Podobně například oblíbený editor HomeSite. Kdo chce tedy používat pro úpravy stránek Notepad (a třeba já chci), ten buď musí používat windows-1250, nebo se naučit těch psát v ISO těch 6 znaků pomocí altu s čísly.
Jste-li tvorové windowsáčtí (a budete navždy), používejte kódování Windows. Dostanete se do menšího počtu problémů.
Pokud nebudete stránky psát v Notepadu nebo nejste zaměstnanci firmy Microsoft, doporučuji kódování ISO 8859-2. Já jsem dříve používal Windows-1250, nyní ISO 8859-2.
Zásadní vtip je v tom, že ISO je kódování výhradně používané v emailech a v Unixu a Linuxu. Samozřejmě že Unixovské a Linuxovské programy windowsácké kódování nějak zvládnou (přinejhorším se ty programy trochu přepíšou), ale nedělá to dobrotu.
Dalším, sice pochybným, přesto často uváděným argumentem je fakt, že je to kódování "standardní". Windows-1250 bylo později standardizováno také, ale všeobecně se těší menší podpoře standardních systémů.
Jsou různé způsoby, jak na systému Windows pracovat v kódování iso-8859-2 .
Nejmodernější kódování má výhodu v tom, že výborně umožňuje psát v různých jazycích najednou. Třeba česky a rusky nebo česky a řecky (proto například používám kódování UTF-8 na svém webu o Krétě).
Zápis UTF výborně podporuje základní windowsácký editor Notepad (nikoli ve verzi 98) a dobře s ním pracují i další oblíbené editory (FrontPage, PSPad apod.). V HomeSite lze na UTF-8 přepnout přes Option > Settings > File Settings, Enable Non-ANSI encoding. Na druhou stranu se stále objevují editory, které soubory psané v UTF neumějí dobře načíst.
Co se prohlížečů týká, neznám žádný normálně používaný prohlížeč, který by UTF-8 neskousnul.
UTF-8 je chápáno jako výchozí kódování XML dokumentů. Milovníkům XHTML (mezi něž shodou okolností nepatřím) jej doporučuji používat, protože potom nemusejí použít XML prolog.
Fajn, máme tady několik různých kódování. Text stránky se prostě napíše v některém z nich. Teď jde o to JAK říci prohlížeči u čtenáře (obecně klientovi), v jakém kódování text je, aby se to správně zobrazilo:
Aby se v prohlížeče u uživatele čeština správně zobrazila, umisťuji do hlavičky stránek jeden meta tag:
<meta charset="iso-8859-2">
nebo:
<meta charset="windows-1250">
nebo pro moderní kódování UTF-8:
<meta charset="UTF-8">
Říká to, že stránka je psána v tom kterém kódování. Prohlížeč to pochopí jako ekvivalent http hlavičky a text nabídne v onom kódování.
Zmíněný meta tag je potřeba mít na začátku hlavičky dokumentu (oblast <head>), ještě před titulkem (tagem <title>). Pokud by titulek obsahoval čárkovaná písmenka, a meta tag by byl až za ním, mohlo by v Internet Exploreru dojít k tomu, že se stránka prostě nezobrazí. Příklad správného zápisu:
<head>
<meta charset="windows-1250">
<title>Titulek stránky</title>
...
</head>
Zadávání tohoto meta tagu nabízejí některé editory automaticky (například dobře nastavený FrontPage 2000: Tools / Web Settings / Language / Default HTML Encoding).
Dříve (před rokem 2012) se kódování muselo deklarovat složitějším meta tagem, který má zápis tento:
<meta http-equiv="content-type" content="text/html;charset=utf-8">
(Šlo tedy o zápis ekvivalentu http hlavičky.)
Pokud stránka neobsahuje meta tag nebo nedorazí se serverovou hlavičkou o kódování, umožňují prohlížeče překódovat text přímo na klientském počítači. Prostě si čtenář vybere kódování (je to někde v nabídce, většinou zobrazit / kódování) a zkouší různá kódování, dokud to není česky. To je relativně jednoduché.
Problém je tu s uživateli. Nemylme se -- jen mizivé procento uživatelů umí kódování přepnout, třebas je to prosté. Takže lepší je přidávat meta tag.
Pokud server i klient používají http protokol 1.1 a na serveru běží program pro automatickou změnu kódu, není třeba se starat vůbec o nic. Je-li tomu tak, ví zpravidla správce serveru (ptejte se na modul ModCzech).
Klient zašle serveru požadavek zároveň se seznamem různých kódování, která
akceptuje. Sever stránku do nějakého takového převede a pošle je klientovi.
Připojí do hlavičky text
text/html; charset=windows-1250
, třeba. Klient pak už ví.
Drobné problémy nastávají při ukládání v cache pamětech nebo na offline prohlížení. Serverově upravené stránky totiž podle mé zkušenosti nejsou ukládány.
Pokud server používá automatické překódování a zároveň uvádíte do hlavičky meta tag content-type, může nastat velký problém, protože deklarace kódování bude vlastně dvojí, což prohlížeč zmate. V tom případě nastává rozsypaný čaj. Takže se buďto ujistěte, že na serveru nic takového neběží, nebo meta hlavičku raději nezadávejte. Co mi o tom napsal Jirka Kosek:
"Problém je v tom, že ... SaCzech neumí odstraňovat meta tag poté, co provede překódování. Umí to třeba csacek."
Na serverech, kde běží ModCzech (jiný častý modul na kódování češtiny), se soubory s meta tagem content type vůbec nedokážou odeslat a hlásí to chybu zero content size.
Je s tím zbytečně moc práce a je riziko chyb. Meta tag už je oblíbený způsob deklarace kódování a serverové překódování ztrácí smysl.
Výše už jsem zmiňoval Unicode v kódování UTF-8. Ještě se k němu vrácím.
Znaková sada Unicode se dá zapisovat různými způsoby:
České znaky tedy nahrazuje Unicode dvojicí bajtů (namísto jednoho jako jiná kódování), takže když se na text podíváte na disk nahrubo třeba hexovým editorem, uvidíte místo jednoho českého znaku znaky dva (nějaké klikyháky, z toho první většinou nějaké velké A).
Meta tag pro nastavení UTF-8:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Malá rekapitulace pojmů:
URL encoded češtinu zde zmiňuji jenom proto, že na ní náhodou někdy můžete narazit, tak abyste byli alespoň trochu v obraze. Není to moc důležitá věc.
Když se z formuláře předávají data a vyskytne se tam čeština, prohlížeč to překóduje na "URL encoded" tvar. Před každý znak dá procento a pak hexadecimálně zapíše dvěma znaky index českého písmene.
Příklad: slovo kočička se do URL encoded zápis přepíše takto: ko%E8i%E8ka.
URL encoded, jak už název napovídá, je zápis, který se může dávat do URL. Do URL (do adresy) totiž správně žádné znaky s diakritikou nepatří. Při přepisu textu do URL encoded je ale potřeba dávat bacha na to, jakým kódováním je stránka, která takové URL zpracovává, napsaná. Potřebuje totiž diakritiku zakódovanou podle svého kódování. Když třeba do hledání na Seznamu, které je kódováno v UTF-8, a pošlete URL encoded zápis v iso-8859-2, tak se bude místo smysluplného slova hledat nějaký rozsypaný čaj. Musí se to tam posílat zakódované v UTF-8 (což ostatně všechny tamní formuláře dělají).
URL kód každého písmene můžete zjistit tak, že si ho napíšete do nějakého formuláře (zkontrolovat kódování), odešlete a kouknete se do adresy, co se s tím písmenem stalo. Hodnoty pro následující tabulku jsem získal z formulářů escapování do iso-8859-2, escapování do windows-1250 a escapování do UTF-8.
znak | ve windows-1250 | v iso-8859-2 | v UTF-8 |
---|---|---|---|
ě | %EC | %EC | %C4%9B |
š | %9A | %B9 | %C5%A1 |
č | %E8 | %E8 | %C4%8D |
ř | %F8 | %F8 | %C5%99 |
ž | %9E | %BE | %C5%BE |
ý | %FD | %FD | %C3%BD |
á | %E1 | %E1 | %C3%A1 |
í | %ED | %ED | %C3%AD |
é | %E9 | %E9 | %C3%A9 |
ď | %EF | %EF | %C4%8F |
ť | %9D | %BB | %C5%A5 |
ň | %F2 | %F2 | %C5%88 |
ú | %FA | %FA | %C3%BA |
ů | %F9 | %F9 | %C5%AF |
Š | %8A | %A9 | %C5%A0 |
Č | %C8 | %C8 | %C4%8C |
Ř | %D8 | %D8 | %C5%98 |
Ž | %8E | %AE | %C5%BD |
Á | %C1 | %C1 | %C3%81 |
Ú | %DA | %DA | %C3%9A |
Dříve jsem se domníval (a zde uváděl), že v javascriptu se dá URL encoded zápis převést zpět na český text pomocí funkce unescape(). Teď jsem to ale zkusil a funguje to nějak blbě.
Existuje způsob, jak některé české diakritizované znaky zobrazit v prohlížeči bez ohledu na kódování. Vkládají se pomocí &; entit; například "a s čárkou" se píše "á". Pokud jsem napsal, že to jde jenom pro některé znaky, pak jsem tím myslel znaky s čárkou. Háček se mi tímto způsobem nikdy vykouzlit nepovedlo. Takže je to prakticky nepoužitelné.
Symbolický zápis | Co je nad písmenem ? | Příklad | Zobrazení příkladu |
---|---|---|---|
&?tilde; | vlnovka | ñ | ñ |
&?circ; | stříška | ê | ê |
&?uml; | dvě tečky | ä | ä |
&?caron; | háček | š | š |
&?acute; | čárka | í | í |
&?grave; | opačná čárka | à | à |
&?ring; | kolečko, kroužek | å | å |
&?slash | přeškrtnuté písmeno | ø | ø |
Vizte též entity v html, asi všechny použitelné HTML entity. Všechny české znaky se dají zapsat pomocí číselné entity, to doporučuji dělat ale jenom v nouzi.
Vcelku vynikající HTML editory jsou nepoužitelné pro české texty, protože všechny české diakritikované znaky (ve wysiwyg módu) se pokoušejí překódovat na tyto symboly. Neumím to nikde vypnout ani nastavit (ačkoli na to dostávám nefunkční návody). To je v českém textu poněkud nešikovné. (Budu přesnější -- je to na pěst!) Navíc u háčkovaných znaků dělají editory chyby, protože se všechny snaží nahradit entitami. Takže například namísto znaku ř se zadává znak ø (ø). V některých editorech to jde vypnout, ale často to vypnout nejde.
Optimální je používat linuxový prográmek iconv.
Dříve jsem používal program Konvertor, který je volně ke stažení na http://www.volny.cz/drd/konvertor/download.html, ale neumí UTF-8, takže už je dost na nic.
Docela dobře se dá konvertovat pomocí programu Microsoft Web Expression 4. Je už bezplatný. Konvertování probíhá tak, že se vytvoří nová DWT šablona v cílovém kódování (tedy asi UTF-8) a připojí se k souborům ve starém kódování. Překvapivě všechno funguje.
Jak psát web píše Yuhů, Dušan Janovský. Kontakt.