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

Srovnání CGI-skriptů

Obecné vlastnosti

[Tabulka zalomená v ASCII]
CGI-skriptVerzeJazyk a platformaUmístění volbyAdresování odkazůOznačení kódováníPráce s obrázkyVstup
C-SaCzech 1.3.3, freeware C; unix, NT jméno skriptu relativní WWWdia relativní průchozí file, http, guess
Czech plug-in 1.0d7 (23.9.1997) C; Mac OS jméno skriptu, dotaz, Accept-language relativní WWWdia, CzechWeb relativní file
CzechHTTP 2.0d8 (22.1.99), freeware nahrazen Text Encoding Plug-Inem
gw_convert.pl (14.8.96), freeware? perl; unix cesta relativní gw_convert relativní opraví, nezvládá JPEGy file
kod 1.4 (28.3.97), public domain perl; unix cesta relativní kod, WWWdia relativní opraví file
SaCzech 2.0, freeware perl; unix, NT jméno skriptu relativní WWWdia relativní průchozí file, http, guess
Text Encoding Plug-In 1.0b1 (19.9.1999), freeware C; Mac OS dotaz relativní s volbou CzechHTTP (CzechWeb) obyčejné relativní file
compose 2.0 (bez vývoje), public domain C; unix cesta relativní WWWdia, rozumí všem ostatním relativní průchozí file
WWWdia K2.2 (bez vývoje), freeware C; unix dotaz relativní s volbou WWWdia absolutní file

Vnitřní příkazy skriptů

[Tabulka zalomená v ASCII]
CGI-skriptVerzeZměna výchozího kódováníLišta volby kódováníÚseky dokumentuVkládání souborů
AutomatickáPříkazem
C-SaCzech1.3.2 (16.2.97), public domainanonastavitelnáanopodle kódování, jazyka nebo domény čtenáře-
Czech plug-in1.0d7 (23.9.1997)ano-ano-ano
CzechHTTP2.0d6 (25.9.98), freewarepouze podle dotazu na soubor---ano
gw_convert.pl(14.8.96), freeware?-----
kod1.4 (28.3.97), public domain-při výstupu ASCIIano--
SaCzech2.0, freewareano-ano--
compose2.0 (bez vývoje), public domainano--podle kódování, jazyka a přepínačůano
WWWdiaK2.2 (bez vývoje), freeware-----


Kritéria obecných vlastností

Platforma a jazyk

Samozřejmě, že již není nepřekonatelným problémem přenést program na jinou platformu, je to však dost zbytečná práce. Toto kritérium je tedy zřejmě nejdůležitějším faktorem a podle použitého programovacího jazyka lze navíc usuzovat na rychlost a efektivitu programu - C se zkompiluje a je tedy nejrychlejší, perl je interpret náročný na paměť a sh se vyznačuje spouštěním mnoha pomocných procesů.

Umístění volby kódování

CGI-skript používáte jako "rouru" na dodávaný soubor, tj. začleníte ho do URL konvertovaného dokumentu.

URL stránky bez převodu:
http://server/cesta/doc.html
URL s převodem:
http://server/cgi-bin/skript/cesta/doc.html
kde cgi-bin/skript je cesta a jméno použitého konverzního programu a cesta je cesta k dokumentu.

Skriptu je však třeba předat i informaci o požadovaném kódování souboru. Tuto informaci je možné (pořadí podle šikovnosti)

  1. Předat v HTTP hlavičce v poli Accept-charset
    Na toto pole zatím reagují většinou jen češtinové moduly a jen velmi málo prohlížečů dovolí tuto volbu nastavit, byť je tento způsob v principu cestou ideální. Více se dočtete v popisu MIME.
  2. Předat v HTTP hlavičce v poli Accept-language
    Tuto volbu dovolí nastavit mnohem více prohlížečů, proto na ni např. reaguje Czech plug-in L. Popova. Jedná se však o částečné zneužívání významu pole - původně slouží k označení požadovaného jazyka, a nikoli znakové sady. Více se opět dočtete v popisu MIME.
  3. Předřadit před cestu k dokumentu v URL v podobě falešného adresáře
    http://server/cgi-bin/skript/volba/cesta/doc.html
  4. Začlenit do jména skriptu v URL
    http://server/cgi-bin/skriptvolba/cesta/doc.html
  5. Připojit na konec URL v syntaxi dotazu na server
    http://server/cgi-bin/skript/cesta/doc.html?volba

Nejméně šikovnou volbou je předávání informace o volbě kódování připojené na konci URL, neboť je v takovém případě nutné pro každý odkaz v překládané stránce tuto volbu explicitně opakovat (případně to skript dělá automaticky - na to ale musí všechny odkazy vyhledávat). Viz též adresování odkazů relativní s volbou níže.

Jak jsem již zmínil, nejvhodnější je naopak požadavek v hlavičce Accept-charset (nebo v horší variantě Accept-language), protože URL na dokument není kromě cesty na skript pitvořena ještě navíc označením kódování. Některé servery navíc dovolují CGI-skript nezařazovat do URL vůbec, ale spouští jej automaticky při požadavku o určitý typ dokumentu - v takovém případě se skript chová stejně nenápadně jako modul do serveru.

Adresování odkazů

Předpokládá se, že dokumenty, na než se již překódovaný dokument odkazuje, budou poskytnuty v témže kódování. Je tedy nezbytné, aby HREF na další dokument obsahoval (nebo lépe: vyjadřoval) URL s platnou volbou kódování.
relativní
Je-li volba součástí URL předřazené před jméno dokumentu, funguje každý relativní odkaz správně. (URL se totiž vytvoří ze stávající URL a tato již volbu obsahuje.)
relativní s volbou
Je-li volba v URL až za jménem dokumentu, je nutné tuto volbu zopakovat na konci každé relativní URL, např.:
../ovoce/jablka.html?volba z dokumentu /potraviny/zelenina/mrkev.html
../ovoce/jablka.html#stopka?volba z dokumentu /potraviny/zelenina/mrkev.html
s výjimkou URL odkazujících se jinou část současného dokumentu, např.:
#stopka z dokumentu /potraviny/ovoce/jablka.html
Vysvětlení: URL se vytvoří z cesty k stávajícímu dokumentu, kde žádná volba přítomna není. Zopakováním volby v relativní adrese vnutíte tuto volbu do výsledné URL. Výjimka odkazů na jinou část téhož dokumentu pramení z interpretace #části samotným browserem a server do hry nevstupuje vůbec; odkaz na #část?volba by browser jedině zmátl, neboť dokument žádnou část jménem "část?volba" neobsahuje.
absolutní
Při absolutním adresování je samozřejmě nutné uvést volbu vždy. Naopak je tu možnost přejít na jiný server, kde může být čeština podporována i jiným skriptem - viz kritérium Označení kódování.

Označení kódování

Zápis volby se liší program od programu. Proč se tím ale zabývat?

Pakliže čtenář již jednou zvolí kódování, řekněme že na serveru s WWWdia, neměl by být při použití odkazu na nějaký jiný server podporující češtinu jiným způsobem (např. kodem) opět požádán o volbu kódování, neboť výchozí WWWdia by za optimálních podmínek měl tento odkaz automaticky upravit, rozšířit o platnou volbu kódování, stejně jako to dělá u lokálních odkazů nebo u odkazů na servery s WWWdia.

Nejdůležitější součástí volby je samozřejmě označení požadovaného kódování, v odkazech použitých v překládaných dokumentech se na takové místo píše "neutrální" volba, tj. řetězec, který je při překladu nahrazen označením cílového kódování.

Následující tabulka ukazuje, že jakýs takýs standard se v označování kódování na WWW vyvinul. Tento standard je však bohužel odlišný od standardu MIME, používaného v celém Internetu. (Na WWW se MIME drží např. češtinové moduly do serverů.)

[Tabulka formátovaná v ASCII] (Údaje podle kodu, který je nadobyčej kompatibilní.)
Plné jméno znakové sadyWWWdia, C-SaCzech, compose, SaCzechkod, encodecodegw_convert.plCzechHTTP
neutrální, při převodu nahrazeno __CHARSET__ - MacCE
ASCII ASCII asc ascii a ASCII
ISO Latin (8859) 2 ISO-8859-2 iso isolat2 i ISO2
ISO Latin (8859) 1
(pouze část českých znaků)
ISO-8859-1 iso1 isolat1 - ISO1
Macintosh Central Europe MAC mac cemac m MacCE
Windows EE, CP1250 CP1250 win w1250 w CP1250
bří. Kameničtí KEYBCS2 kam cskam k KamCS
PC Latin 2, CP852 CP852 cp pclat2 l Latin2

Jak je vidět, jedním standardem je WWWdia, druhým kod (code neznám). Vzájemná kompatibilita volby v odkazu na jiný skript je u skupin skriptů se stejným druhem označení zaručena (kromě odkazů z "WWWdiovských" stránek na compose, který má ve své volbě ještě další přepínače, jejichž nastavení by měl uživatel moci ovlivnit). Kod je kompatibilní jak s "WWWdiovskými skripty", tak i s codem (víte, kde se dá nalézt? napište!).

Práce s obrázky

Obrázky a další objekty, na něž se přeložená stránka odvolává, je za normálních okolností možné adresovat:
absolutně
http://www.server.cz/cgi-bin/barevne/ikonka.gif
URL je "plnohodnotná", pevně zakotvená na určité místo, a proto jí průchod kódovacím skriptem nijak nehrozí.
relativně
../back.gif
Relativní adresování je všeobecně považováno za vhodnější, podstatným pro naši otázku však zůstává fakt, že se konečná URL vytváří z URL vašeho dokumentu (nebo URL specifikované pro celý dokument tagem BASE), tedy URL vedoucí přes kódovací skript (viz úvod kapitolky Volba kódování), např.:
http://server/cgi-bin/skript/cesta/obrázek.gif
Je pochopitelné, že překódovávat obrázek je nesmysl. Skripty, které umožňují obrázky a jiné objekty adresovat relativně, jsou:
průchozí
Skript odpoví na požadavek o obrázek ap. (tedy soubor bez přípony indikující nutnost převodu) pouze hlavičkou HTTP, v níž klientovi sdělí skutečnou polohu souboru. Klient pak o tento soubor znovu požádá.
opraví
Již při průchodu výchcozího dokumentu opravuje skript relativní odkazy obrázků na absolutní ukazující na objekt přímo.

Vstup

CGI-skript může získávat data k překódování a poslání klientovi různým způsobem:
file
indikuje obvyklý způsob, tj. ze souboru, který byl skriptu určen z URL.
http
skript získá data pomocí protokolu HTTP, tedy rekurzivní zavoláním serveru. Výhodou tohoto způsobu je možnost překládat výstup z CGI-skriptů, skrývá se tu však úskalí v chování serveru, který může chtít nejprve dokončit konverzní skript a teprve pak se zabývat novým požadavkem.
guess
je kombinací obou metod, kdy skript sám rozhodne, zda má data získat rychlejším přímým čtením ze souboru nebo rekurzivně volat server.


Kritéria vnitřních příkazů skriptů

Změna výchozího kódování za letu

Část souboru vyznačená určitým příkazem se převádí z jiného kódování, než je pro skript implicitně nastaveno. Této schopnosti s úspěchem mohou využít autoři stránek, kteří vytvářejí soubory v jiném kódování, než je standardem na jejich serveru. Praktické výhody v jednom souboru obsahujícím části textu v různých kódováních nevidím, nicméně skripty toto principielně umožňují.

CzechWeb (předchůdce CzechHTTP) býval poněkud atypický - umožňoval totiž čtenáři zadat v URL na dokument i zdrojové kódování dokumentu, tedy kódování, v němž je soubor uložen na serveru. (Pokud je tedy dokument uložen na disku v jiném kódování než v implicitním CE, je chyba na straně toho, kdo zadal URL na tento dokument bez explicitního určení jiné zdrojové kódové stránky.) Nevím, zda stejné ovlivňování dovoluje i současný CzechHTTP.

Lišta s tlačítky pro výběr kódování

[asc] [iso] [win] [mac] [vyber]

Lišta s tlačítky pro výběr kódování může být skriptem přidána na konec dokumentu automaticky (např. u kodu pouze pokud je dokument převeden do ASCII, C-SaCzech umožňuje automatické přidání lišty nastavit a lištu je možné dokonce pozměnit - zvolit dlouhou nebo krátkou variantu ap.).

Pokud poloha lišty nevyhoduje, je možné umístit ji vnitřním příkazem kamkoli na stránku. Při průchodu skriptem se tento příkaz nahradí samotnou lištou.

Úseky dokumentu

Skript dává autorům stránek možnost uložit do téhož dokumentu např. český i anglický text a podle požadovaného kódování čtenáři předložit pouze odpovídající části. "Kódováním" může v tomto případě být i např. angličtina. Tuto schopnost má kod, C-SaCzech a compose.

C-SaCzech umí rovněž poskytnout nebo vypustit vyznačenou část dokumentu podle označení domény počítače, který o stránku požádal.

Compose navíc umožňuje nastavovat dodatečné volby zobrazení pomocí několika přepínačů a následně podle těchto voleb poskytnout čtenáři jen určité části dokumentu, pro něž je volba zapnuta resp. vypnuta. Např. lze takto do jednoho dokumentu uložit úsek pro Netscape i stejnou tabulku "vykreslenou" v <PRE>:

+---+---+
| A | B |
+---+---+

Vkládání souborů

Compose má příkaz, pomocí něhož lze do výstupu překladu vložit obsah a rekurzivně interpretovat další composové příkazy nějakého souboru (např. standardizované patičky, případně simulované lišty kódování).

C-SaCzech víceméně vkládání souborů dovoluje také - přenechá totiž zpracování tzv. Server-Side Includů (příkazů v dokumentu interpretovaných http serverem při poskytování stránky) na serveru a jeden z používaných SSI k vkládání souborů slouží.