Nahlédněte i do Diskuse pod čarou!

Háčkovaný vstup dat od uživatele

Sami můžete podniknout několik experimentů.

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í.

Právě používané kódování (to, v kterém čtenář stránky právě čte)

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)

Ruční volba uživatele

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.

Elektronická věštírna

Ještě je jedna možnost, jak uživatele neobtěžovat s volbou v nabídce - nechte si poslat skryté pole:
<INPUT Name="sample" Type=Hidden Value="čeština">
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 č 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.)

Komplexní síťová magie

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.


Lynx na Unixu (zadáno i čteno v ISO-8859-2)

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

Netscape 2.0 pro Maca (zadáno v CE)

Document Encoding nastaveno na Central European (Latin2), tj. ISO-8859-2

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

Document Encoding nastaveno na Central European (Mac), tj. Macintosh CE

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