Nahlédněte i do Diskuse pod čarou!
Před časem, jsem řešil stejný problém jako většina webmasterů v čechách. Samozřejmě rozumné řešení českého kódování. Musel jsem zohlednit několik požadavků, za prvé budovaný server byl určen, pokud možno, pro širokou zdravotnickou veřejnost u které se nedá očekávat znalost technických detailů jako kódová stránka, nemožnost použít nejelegantnějšího řešení posílání všeho v ISO 8859-2, pro chyby v netscape všech verzí, potřebu vytvoření databází s možností prohledávání a tím pádem potřebu přenosu požadavků od klienta v čitelné podobě. Po vyzkoušení všeho, co se u nás vyskytuje jsem se jednoznačně rozhodl pro mod_czech od firmy Intesoft. Protože mám pocit, že tento modul není příliš znám, píši následující text.
Tento modul je určen pro http démon Apache, to v současné době sice omezuje jeho použití jen na servery pod unixem, ale již je v přípravě i Apache pro Windows. Po příjmu požadavku zjišťuje, jestli klient posílá explicitně požadavek, ve které kódové straně má text obržet a pokud ano tak mu vyhoví. Pokud ne, odešle se dokument v kódování podle operačního systému klienta, pokud není v hlavičče obsažen ani operační systém klienta, odešle se text v US-ASCII. Přitom samozřejmě umožňuje i volbu kódové stránky uživatelem. Umožňuje potom předávání požadované kódové strany jak prefixem, tak postfixem (např. index.html.CP1250), umožňuje přechod z "konkurenčních" překódovávačů bez změny jediného dokumentu (Samozřejmě ne ze všech, ale např. ze Sacku ano a i z dalších, které používají "různé adresáře" pro různá kódování dokumentů nebo různé přípony souborů pro různá kódování.). V jakém kódování je dokument na serveru uložen se určuje globálně, pro každý adresář zvlášť nebo pro každý dokument zvlášť. Server podle konfigurace zasílá nebo nezasílá v http hlavičce charset. Modul je integrován přímo do serveru a není volán jako externí program, což zrychluje jeho běh. Všechny konfigurační direktivy si načítá z konfiguračních souborů Apache. Konfigurace může být pro každý virtuální server odlišná. Při hledání problémů umožňuje logování informací o svém běhu, použité kódové starně apod.
Modul umožňuje i překódovávání vstupních polí formulářů, pro zpracování na serveru. Do jakého kódování se překódovává se opět určuje dle libosti pro každý adresář zvlášť. Tato možnost ještě není dokonale propracována, ale ve spojení s PHP/FI funguje naprosto spolehlivě. V době psaní tohoto textu je možné použít jen "cgi" verzi PHP/FI, varianta PHP modul je v přípravě. Algoritmus detekce kódování v jakém klient posílá požadavek je stejný jako při překódovávání odesílaného dokumentu.
Pro představu uvádím výběr z konfiguračního souboru
http.conf
, část týkající se čestiny, tak jak ji používám
v reálném provozu.
#................... CZECH SECTION ....................... # Vsechny direktivy uvedene v httpd.conf je mozne vztahnout # k jednotlivym virtualnim serverum pro jejich individualni nastaveni # SourceCzechCodePage: defaultni kodova stranka dokumentu ulozenych # na serveru, Default CP1250 SourceCzechCodePage CP1250 #FormDataEncode: (Yes|No) zda se maji prekodovat data z formularu #v QUERY_STRING a POST (mulitpart/form-data) zatim neimplem. #defalut: Yes FormDataEncode Yes #FormDataCPTarget: kodova stranka do ktere se budou konvertovat #data z formularu v QUERY_STRING a data zaslana metodou POST FormDataCPTarget ISO-8859-2(tohle Vám možná připadá nelogické, ale požadavky předávám výhradně do MySQL, které podporuje jen ISO. Šablony pro dynamické strany jsou v ISO-8859-2 a jsou v adresáři, kde je v souboru .htaccess toto
Options All SourceCzechCodePageLocal ISO-8859-2konec vsuvky)
#CacheControl: [Yes|No] default No urcuje pridavani do mime #Cache-Control: private a no-cache CacheControl YesTohle je potřeba aby nám cache neposlala stranu v jiném kódování než odpovídá našemu klientu.
#SetLastModified: [Yes|No] default No urcuje nastaveni polozky #MIME Last-Modified na aktualni datum pro konverzi CP dokumentu #misto jeho skutecneho data modifikace SetLastModified No # PragmaNoCache: Nastavuje zda se v MIME posila Pragma: no-cache # polozka, parametr nabyva hodnot [Yes|No], Default No PragmaNoCache Yes # AddCPToContentType: [Yes|No] zda se ma pridavat do Content-type: # k typu i znakova sada. Napr. "Content-type: text/html; windows-1250" # defaultne je "No" AddCPToContentType YesTady je nutné zvážit, jestli používáte javu. Pokud ano musíte dát NO, jinak v netscape java nepoběží, NS má totiž chybu v předávání parametrů procedurám pokud se content type liší od ISO-8859-1. Jinak je vhodné (alespoň podle mne) content type zasílat.
# SetEncodingPage: <root_realtive_url_path> Nastavuje URL stranky # pro zmenu kodovani. Stranka se uvadi relativne k DocumentRootu
# (default chcp.htm) SetEncodingPage /chcp.htm #AddCzechEncodingType <koncovka souboru>, registruje typy #souboru podle jejich koncovky ke ktreym se v posilanych #dokumentech bude pridavat postfix o vybranek kodovani #Napr. xxx.htm -> xxx.htm.CP1250 #To, ze je k nejakemu souboru pridan tento postfix jeste #neznamena, ze bude prekodovan. Prekodovan bude pouze, ze #server urci jeho Content-type na text/* #"AddCzechEncodingType *" zpusobi, ze se pridavaji postfixy ke #vsem souborum #"AddCzechEncodingType ." zpusobi, ze pridavji postfixy za soubory #bez koncovky #K adresarum ("http://xx/adr/") se postfix pridava vzdy #AddCzechEncodingType htm AddCzechEncodingType html htm phtml shtml AddCzechEncodingType txt doc AddCzechEncodingType . AddCzechEncodingType exe #AddCzechEncodingType * #EncodeContentType <content-type> # Direktiva nastavuje CT, ktere budou prekodovany modulem EncodeContentType text/html EncodeContentType text/plain Addmod_czechServer czech.intersoft.cz Addmod_czechServer slov.intersoft.czToto jsou jména "spřátelených" serverů, které také používají mod_czech. Umožní uživatelům přebrouzdání na jiný server se zachováním správného kódování.
# AddCzechPrefixAlias a AddCzechPostfixAlias definuji nove prefixy # a postfixy pro explicitni volbu kodovani. Prvni definovany prefix # prislusny nektere kodove strance je defaultni, tj. uziva se pro # udrzovani kontextu. # Durazne doporucujeme nektery z nasledujicich aliasu' rusit JEN # v pripade, ze se "tluce" s nekterym vasim jiz existujicim adresarem. # Dokaze-li totiz czech_module rozeznat volby kodovani v ruznych # pouzivanych tvarech, ulehci to lidem, kteri jsou na ten "svuj" # tvar zvykli, snadnou zmenu kodu (napr. na ASCII kvuli tisku) a # v jistem smyslu i sjednoti web. O nic pritom neprijdete. # Nasledujici radky jsou pouze ilustrativni slouzi jako ukazka # jak definovat aliasy, tyto prefixy jsou "natvrdo" v modulu # takze jejich zapoznamkovani se neprojevi AddCzechPrefixAlias CASCII asc AddCzechPrefixAlias CP1250 win AddCzechPrefixAlias CISO8859-2 iso AddCzechPrefixAlias CP852 lat 852 AddCzechPrefixAlias CKAM kam AddCzechPrefixAlias CMAC mac AddCzechPrefixAlias CKOI8CS koi AddCzechPrefixAlias CISO8859-1 eng AddCzechPrefixAlias no-code no-code noconv # Nasledujici jsem videl pouzivat, ale nevim, jestli jsou rozsirene. #AddCzechPrefixAlias lat pcl #AddCzechPrefixAlias asc us #AddCzechPrefixAlias iso unix #AddCzechPrefixAlias lat cp #AddCzechPrefixAlias koi east AddCzechPrefixAlias CISO8859-1 iso1 # Nasledujici radky jsou pouze ilustrativni slouzi jako ukazka # jak definovat aliasy, tyto postfixy jsou "natvrdo" v modulu # takze jejich zapoznamkovani se neprojevi AddCzechPostfixAlias CASCII CASCII AddCzechPostfixAlias CP1250 CP1250 AddCzechPostfixAlias CISO8859-1 CISO8859-1 AddCzechPostfixAlias CISO8859-2 CISO8859-2 AddCzechPostfixAlias CP852 CP852 AddCzechPostfixAlias CKAM CKAM AddCzechPostfixAlias CMAC CMAC AddCzechPostfixAlias CKOI8CS CKOI8CS # Nasledujici radky usnadni prechod z kodovaciho programu SaCzech. # I kdyz jste SaCzech nikdy nepouzivali, doporucujeme tyto radky # nezakomentovavat, nic koneckoncu neztratite. AddCzechPrefixAlias asc toASCII cgi-bin/toASCII AddCzechPrefixAlias win toCP1250 cgi-bin/toCP1250 AddCzechPrefixAlias iso toISO-8859-2 cgi-bin/toISO-8859-2 AddCzechPrefixAlias lat toCP852 cgi-bin/toCP852 AddCzechPrefixAlias kam toKEYBCS2 cgi-bin/toKEYBCS2 AddCzechPrefixAlias mac toMAC cgi-bin/toMAC AddCzechPrefixAlias koi toKOI8-CS cgi-bin/toKOI8-CS Redirect permanent /cgi-bin/to__CHARSET__/ http:/ Redirect permanent /cgi-bin/whichcode/ http:/ # Nasledujici radky umoznuji pouzivani ceskych extenzi' pro urceni # kodovani, v kterem je zdrojovy text dokumentu ve formatu text/html. # Blizsi podrobnosti v souboru Readme.txt. # Zmenite-li obsah tabulky extenzi' (czextensions[] v mod_czech.c), # musite prislusne upravit i tyto radky. # # LookForCzechExtension On/Off, povoli nebo zakaze substituci ceskych # pripon za .html. # Default je Off. #LookUpCzechExtensions On #AddType text/html asc iso win pcl 852 kam koi mac eng #AddIcon /icons/layout.gif .asc .iso .win .pcl .852 .kam .koi .mac .eng #................. END OF CZECH SECTION .....................
Pokud používáte na serveru cgi programy budou mít v enviromentu oproti běžným zvyklostem navíc proměnné CZECH_OUTPUT_CP a CZECH_INPUT_CP, které obsahují název kódové strany do které se dokument pro klienta překódovává (czech_output_cp) a v jakém kódování byla pole v formuláři před převodem (czech_input_cp).
A nakonec důležitá zpráva, je zdarma, jediné co musíte pro jeho používání udělat je umístit logo tvůrce na svůj server. Všechny další informace, modul a popis spoustu dalších možností, které má, naleznete na http://www.intersoft.cz/home/cestina.htm. Verzi modulu si vyberete podle verze apache, kterou používáte.