Kepi.cz

Programování

Kódování češtiny

Na Internetu jsem našel několik typů, jak si poradit s dynamickou změnou kódování na stránkách. Většinou se však jednalo o moduly pro Apache nebo o cgi-skripty poskytované někým jiným. Jelikož si rád udělám nebo předělám vše dle sebe a neměl jsem možnost použití modulu pro server, začal jsem přemýšlet nad jiným řešením.

Prvním problémem bylo, jak zajistit samotné překódování. Není nic jednoduššího než využít funkce StrTr(), která zajistí převedení znaků. Poté jsem si do textového souboru uložil všechny oháčkované a očárkované znaky (malé i velké), které používám. Pomocí příkazu cstocs1 jsem tento soubor převedl do všech kódování, které jsem potřeboval. Nakonec zbývalo jen vytvořit funkci, která se postará o překódování řetězce.

function prekoduj($retezec,$zdroj_kod="iso-8859-2",$cil_kod) { switch($zdroj_kod) { case "iso-8859-2": $kod1 = "ěščřžýáíéúůňťďóĚŠČŘŽÝÁÍÉÚŮŇŤĎÓ"; break; case "ascii": $kod1 = "escrzyaieuuntdoESCRZYAIEUUNTDO"; break; } switch($cil_kod) { case "iso-8859-2": $kod2 = "ěščřžýáíéúůňťďóĚŠČŘŽÝÁÍÉÚŮŇŤĎÓ"; break; case "ascii": $kod2 = "escrzyaieuuntdoESCRZYAIEUUNTDO"; break; } return StrTr($retezec,$kod1,$kod2); }

V této chvíli je potřeba vyřešit, jak může uživatel kódování přepnout, ale také jak uchováme informaci o tom, které používá (jinak by byl nucen měnit kódování na každé stránce). Zvolené kódování uchováme pomocí sessions a pak uvedeme pouze odkaz na změnu kódování.

<href="./page.php?id=id_stranky&kod=iso-8859-2">iso-8859-2</a> <href="./page.php?id=id_stranky&kod=ascii">iso-8859-2</a>

V mém případě je to snadné, jelikož používám jeden skript (page.php), který podle parametru id najde příslušnou stránku v databázi a zobrazí ji. V tomto skriptu také použiji funkci, která v případě žádosti o změnu kódování, aktualizuje session.

if(IsSet($kod)) { session_register(kodovani); $kodovani = $kod; }

Možná byste raději použili odkaz typu ./page.php?id=id_stranky&kodovani=ascii - v tom případě by však skript nefungoval správně. Pokud bychom totiž předali proměnnou $kodovani místo $kod, hned po aktivování sessions (session_start();) by se do $kodovani uložila hodnota ze session a ta předaná by byla ztracena...

Dále je také potřeba, upravit hlavičku html dokumentu vždy, když se změní kódování. Já si opět zjednodušuji život tak, že mám jeden soubor hlavicka.php, který vkládám na začátek každého dokumentu. Soubor hlavicka.php potom vypadá třeba takto:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN"> <head> <title>Nadpis stránky</title> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $kodovani ?>"> <meta name="charset" content="<?php echo $kodovani ?>"> ... ... </head>

Vše potřebné máme připraveno a nyní přichází ten největší oříšek. Jak předat stránku funkci pro překódování? Samozřejmě by bylo možné použít funkci FRead() a její výsledek překódování předat, ale to by fungovalo pouze v případě, že v souborech se samotným obsahem stránky nepoužíváme PHP...

Ale jak to tak bývá, i přesto, že jsem na pořádné řešení nemohl přijít několik měsíců, nakonec jsem brouka vyhrabal v manuálu PHP a je to opravdu velmi snadné. Můžeme totiž využít funkcí pro kontrolu výstupu:

if(IsSet($kodovani) && $kodovani!="iso-8859-2") ob_start(); require("./hlavicka.php"); require("www_stranka.php"); echo "</html>"; if(IsSet($kodovani) && $kodovani!="iso-8859-2") { $data = prekoduj(ob_get_contents(),"iso-8859-2",$kodovani); ob_end_clean(); echo $data; }

Funkce ob_start() zajistí, že se prohlížeči neodešle žádný obsah, ale uchovává se. ob_get_contents() vrátí doposud uchovaný obsah, který použíjeme jako jeden ze vstupních parametrů naší funkce prekoduj(). Nakonec zbývá vyčistit uchovaný obsah pomocí ob_end_clean() a vypsat do prohlížeče překódovaná data.

Doufám, že jsem vám alespoň trochu pomohl při vašich konfrontacích s PHP nebo vás alespoň trochu inspiroval...


1 cstocs je linuxový program, který slouží k překódování textových souborů (více: man cstocs). Samozřejmě můžete použít jakéhokoliv jiného programu, který plní stejný účel...


http://www.kepi.cz
Poslední aktualizace této stránky: 8. června 2005 v 10:51 hodin.
Vytvořil

Stránky běží na serveru: IglooNET.cz