Nahlédněte i do Diskuse pod čarou!
Jak dokládají následující výpisy proměnných prostředí, k nimž se dostane CGI-skript zpracovávající příchozí dotazník, neexistuje přímý způsob zjištění kódování příchozích dat. Prohlížeč prostě takovou informaci neposkytuje. Z čeho lze kódování příchozího textu odhadovat:
HTTP_ACCEPT_CHARSET
(obsah z HTTP hlavičky Accept-Charset
)Tuto informaci může a nemusí prohlížeč předávat (např. Netscape to ještě neumí, u Lynxu tuto volbu nastavuje ručně uživatel, což taky každý rozhodně neudělá). Obecně touto informací dává prohlížeč najevo, které kódování rád čte, nikoli vrací.
Obecně je tento předpoklad věrohodnější - od prohlížeče je logické očekávat spíše kódování, kterým stránku právě ukazuje, než kódování, které zobrazuje nejraději.Za předpokladu, že jsou stránky překládány nějakým CGI-skriptem nebo modulem, není problém předat v dotazníku skryté pole
charset
a jeho obsah nechat vyplnit jménem právě používaného kódování.Pro WWWdia, SaCzech ap. by příslušný HTML příkaz ve formuláři zněl:
<INPUT Name="charset" Type=Hidden Value="__CHARSET__">
Pro modul p. Lampy lze např. využít SSI a vytisknout kamkoli do textu proměnnou
CHARSET_TO
(zavedena modulem):<!--#echo var="CHARSET_TO"-->nebo využít přímo schopnosti modulu expandovat její obsah v příkazu<INPUT>
:<INPUT Name="charset" Type=Hidden Value="$CHARSET_TO">
Ani tato informace však nemusí platit stoprocentně (proti očekávání se chová např. Netscape 2.0 pro Maca, který odesílá vždy CE, bez ohledu na aktuální kódování stránky)
Pokud uživateli dáte možnost ručně nastavit to, co jeho klient nedělá automaticky, máte pravděpodobně největší šanci na úspěch. Jako implicitní volbu lze doporučit právě to kódování, jímž si dokument prohlíží. (Funkční příklad viz experiment.) Potřebnou nabídku ve formuláři vyrobíte takto:<SELECT NAME="charset" SIZE=1> <OPTION>__CHARSET__ <OPTION disabled>- <OPTION>ASCII <OPTION disabled>- <OPTION>iso-8859-2 <OPTION>apple-ce <OPTION>windows-1250 <OPTION>cp852 <OPTION>iso-8859-1 <OPTION>cp895 <OPTION>KOI8-CS </SELECT>Pokud má skript reagovat na vyplněný dotazník tak, že sám zobrazí nějakou zprávu, je vhodné mít i tak ve formuláři zmíněné skryté pole (nazvané např.
viewcharset
), jehož obsah skript využije při překládání háčkované zprávy do češtiny, kterou si čtenář přeje číst.
Ještě je jedna možnost, jak uživatele neobtěžovat s volbou v nabídce - nechte si poslat skryté pole:Prohlížeč (teoreticky) převede obsah tohoto pole do stejného kódování jako obsah polí, která vyplňuje uživatel. Váš zpracovávající skript pak může podle kódu reprezentujících písmena<INPUT Name="sample" Type=Hidden Value="čeština">
č
aš
určit, co je to za kódování, a převést si obsah dotazníku podle potřeby do něčeho jiného. (Pro rozlišení jednoho z kódování, která se v současné době používají, tahle dvě písmena opravdu stačí, otázka je, jak se však zachovat, jestliže prohlížeč provede nějaký nesmyslný a běžně nepoužívaný převod.)
Do téhle kategorie řadím řešení, která se k vám dostanou "na klíč". Prostě něco nainstalujete a ono to funguje.Příkladem je např. modul mod_czech firmy Intersoft.
AUTH_TYPE= EDITOR=/usr/local/bin/joe GATEWAY_INTERFACE=CGI/1.1 HOME=/ HOST=dec59.ruk.cuni.cz HOSTTYPE=decstation HTTP_ACCEPT=*/*, application/x-wais-source, application/html, text/plain, text/ html, www/mime HTTP_ACCEPT_CHARSET=iso-8859-2, iso-8859-1;q=0.001, us-ascii;q=0.001 HTTP_ACCEPT_LANGUAGE=czMAC HTTP_FROM=obo@cuni.cz HTTP_HOST=www HTTP_USER_AGENT=Lynx 2.5 libwww-FM/2.14 LANG=CHK_DE.8859_2 LOGNAME=root PATH=/usr/ucb:/bin:/usr/bin:/etc:/etc/sec:/usr/etc:/usr/etc/sec:/usr/local/bin: /usr/new:/usr/hosts PATH_INFO= PATH_TRANSLATED=/usr/staff/www/public/obo/getenv PRINTER=arnika PWD=/ QUERY_STRING=ěščřžýáíé REMOTE_ADDR=192.108.152.17 REMOTE_HOST=dec59.ruk.cuni.cz REMOTE_IDENT= REMOTE_USER= REQUEST_METHOD=GET SCRIPT_NAME=/cgi-bin/cgiwrap SERVER_NAME=dec59.ruk.cuni.cz SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SOFTWARE=CERN/3.0pre6 SHELL=/usr/bin/tcsh SHLVL=1 TERM=vt100 USER=root WWW_HOME=http://www/cucc
AUTH_TYPE= EDITOR=/usr/local/bin/joe GATEWAY_INTERFACE=CGI/1.1 HOME=/ HOST=dec59.ruk.cuni.cz HOSTTYPE=decstation HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* HTTP_ACCEPT_LANGUAGE=cz-MAC, cz-ISO-8859-2, cz, en HTTP_CONNECTION=Keep-Alive HTTP_HOST=www HTTP_USER_AGENT=Mozilla/2.0 (Macintosh; I; 68K) LANG=CHK_DE.8859_2 LOGNAME=root PATH=/usr/ucb:/bin:/usr/bin:/etc:/etc/sec:/usr/etc:/usr/etc/sec:/usr/local/bin:/usr/new:/usr/hosts PATH_INFO= PATH_TRANSLATED=/usr/staff/www/public/obo/getenv PRINTER=arnika PWD=/ QUERY_STRING=ěäčTěůáíé REMOTE_ADDR=192.108.152.91 REMOTE_HOST=mac91.ruk.cuni.cz REMOTE_IDENT= REMOTE_USER= REQUEST_METHOD=GET SCRIPT_NAME=/cgi-bin/cgiwrap SERVER_NAME=dec59.ruk.cuni.cz SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SOFTWARE=CERN/3.0pre6 SHELL=/usr/bin/tcsh SHLVL=1 TERM=vt100 USER=root WWW_HOME=http://www/cucc
AUTH_TYPE= EDITOR=/usr/local/bin/joe GATEWAY_INTERFACE=CGI/1.1 HOME=/ HOST=dec59.ruk.cuni.cz HOSTTYPE=decstation HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* HTTP_ACCEPT_LANGUAGE=cz-MAC, cz-ISO-8859-2, cz, en HTTP_CONNECTION=Keep-Alive HTTP_HOST=www HTTP_USER_AGENT=Mozilla/2.0 (Macintosh; I; 68K) LANG=CHK_DE.8859_2 LOGNAME=root PATH=/usr/ucb:/bin:/usr/bin:/etc:/etc/sec:/usr/etc:/usr/etc/sec:/usr/local/bin:/usr/new:/usr/hosts PATH_INFO= PATH_TRANSLATED=/usr/staff/www/public/obo/getenv PRINTER=arnika PWD=/ QUERY_STRING=ěščřžýáíé REMOTE_ADDR=192.108.152.91 REMOTE_HOST=mac91.ruk.cuni.cz REMOTE_IDENT= REMOTE_USER= REQUEST_METHOD=GET SCRIPT_NAME=/cgi-bin/cgiwrap SERVER_NAME=dec59.ruk.cuni.cz SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SOFTWARE=CERN/3.0pre6 SHELL=/usr/bin/tcsh SHLVL=1 TERM=vt100 USER=root WWW_HOME=http://www/cucc