ISO Latin-1 | ISO Latin-2

Rešitev problema slovenskih šumnikov v HTML dokumentih

februar 1996, dopolnitve avgust, september, oktober 1996; avgust, september 1997
Mark Martinec -- mark.martinec@nsc.ijs.si

Izhodišča

Minimalne zahteve

Nabor znakov za začetni dokument (home page)

Ker zna vsak WWW bralnik prikazati dokument v naboru ISO Latin 1 in ker ima bralnik pravico, da dokumentov v drugačnem naboru znakov sploh ne prikaže (ampak npr. ponudi shranitev na zunanjo datoteko), je edina univerzalna varianta ta, da je začetni dokument, katerega URL je javno objavljen, kodiran v naboru ISO Latin 1.

Poleg tega osnovnega URLja lahko objavimo tudi alternative, če imamo možnost objaviti več kazalcev, ni pa sprejemljivo objaviti le npr. ISO Latin 2 ali Windows-1250 različice.

Pri sklicevanju med dokumenti (v linkih) poskušamo ohraniti izbrani nabor znakov, tako se npr. iz ISO Latin 2 dokumenta sklicujemo na ISO Latin 2 različico drugih dokumentov, če te obstajajo, sicer se sklicujemo na ISO Latin 1 različico.

Ker nabor znakov ISO Latin 1 ne vsebuje šumnikov, jih lahko pišemo le kot c s z (ali npr.: "c "s "z oz. *c *s *z). Varianta ISO646-YU (~{`) v ta namen ni sprejemljiva, saj ni podmnožica ISO Latin 1 in krši izjavo strežnika, da gre za ISO Latin 1 dokument (znaki ~{`^[@ v US-ASCII in v ISO Latin 1 so ločila in ne črke).

Dokumenti v drugih naborih znakov

Poleg osnovne (ISO Latin 1) variante dokumentov, lahko ponudimo iste dokumente kodirane tudi v drugih naborih znakov.

Standard določa takole:

Legal values for the charset parameter of the MIME HTML type are:
charset = "US-ASCII"
        | "ISO-8859-1"  | "ISO-8859-2"        | "ISO-8859-3"
        | "ISO-8859-4"  | "ISO-8859-5"        | "ISO-8859-6"
        | "ISO-8859-7"  | "ISO-8859-8"        | "ISO-8859-9"
        | "ISO-2022-JP" | "ISO-2022-JP-2"     | "ISO-2022-KR"
        | "UNICODE-1-1" | "UNICODE-1-1-UTF-7" | "UNICODE-1-1-UTF-8"
        | token

token = 1 * <any CHAR except CTLs or tspecials>
...
Although HTTP allows an arbitrary token to be used as a charset value, any token that has a predefined value within the IANA Character Set registry must represent the character set defined by that registry. Applications should limit their use of character sets to those defined by the IANA registry.
To pomeni, da je najbolj splošno uporabna varianta za slovenščino (poleg ISO Latin 1 ali njegove 7-bitne US-ASCII podmnožice) nabor ISO-8859-2 (t.j. ISO Latin 2 -- ta ni enak naboru MS Windows Latin 2 !). ISO Latin 2 vsebuje vse potrebne šumnike za slovenščino.

Ne glede na izbrani nabor znakov (razen ISO Latin 1) je nujno, da v MIME tipu izrecno navedemo, kateri nabor znakov je uporabljen v dokumentu. HTTP strežniku ne smemo dopustiti, da bi lažno trdil, da gre za ISO Latin 1, v resnici pa bi uporabili v dokumentu nekaj drugega.

Tule je preglednica možnih Content-Type: vrstic v HTTP glavi, ki bi lahko prišle v poštev za slovenščino:

Content-Type: text/html                    (implicira ISO-8859-1)
Content-Type: text/html; charset=ISO-8859-2   (ustreza standardu)
Content-Type: text/html; charset=ISO646-YU    (RFC1345)
Content-Type: text/html; charset=IBM852       (IANA)
Content-Type: text/html; charset=Windows-1250 (IANA: Windows-1250)

Realizacija

Netscape Navigator V2 že avtomatsko preklopi nabor znakov na ISO-8859-2, če dobi táko informacijo (MIME tip) v HTTP glavi dokumenta, Netscape Navigator V3 za Windows in Internet Explorer pa že znata uporabiti obstoječe nabore znakov (Windows-1250) in interno preslikati ISO Latin 2 vanje, tako da ni treba dodatno iskati in instalirati ISO Latin 2 fontov. S tem je glavni zadržek glede uporabe ISO Latin 2 odpravljen in nobene potrebe ni več po dokumentih v drugih kodnih straneh, ki so specifične za osebne računalnike. Tudi Lynx 2-4-FM razume koncept nabora znakov (in dokumenta noče pokazati -- ponudi shranitev na disk -- če uporabnikov terminal nima podpore za Latin 2)

Statični dokumenti

Za statične dokumente, ki se nahajajo na datotekah, HTTP strežniki določijo MIME tip dokumenta iz končnice imena datoteke. Ta MIME tip potem pošljejo bralniku kot Content-Type: vrstico v HTTP glavi dokumenta.

Tako na primer veljajo naslednje standardne preslikave iz končnice imena datoteke v Content-Type: :

.html text/html
.txt  text/plain
.gif  image/gif
.mp2  audio/x-mpeg

Za rešitev problema slovenskih šumnikov lahko tem preslikavam dodamo npr. naslednje:

.html-l2     text/html;charset=ISO-8859-2
.html-646yu  text/html;charset=ISO646-YU
.html-cp852  text/html;charset=IBM852
.html-cp1250 text/html;charset=Windows-1250

Presledek za podpičjem ni obvezen, zato ga lahko mirno opustimo in si morda prihranimo kakšno nevšečnost v boju s sintakso pri vpisovanju dodatne preslikave v konfiguracijsko datoteko strežnika.

Če imamo večino .html datotek že pripravljenih v naboru ISO Latin 2, bi se lahko odločili tudi za alternativno varianto, kjer bi imeli dokumenti s končnico .html privzet nabor znakov ISO Latin 2, končnico .html-l1 pa bi na primer uporabili za ISO Latin 1 kodiranje:

.html        text/html;charset=ISO-8859-2
.html-l1     text/html
.html-l2     text/html;charset=ISO-8859-2

Končnice imen datotek so poljubne (znotraj omejitev računalnikovega datotečnega sistema); ko pa jih izberemo, moramo te končnice tudi uporabiti v imenih datotek, ki jih ta strežnik ponuja.

Izbira končnice imena ne vpliva na bralnike, saj ti upoštevajo le MIME tip dokumenta, ignorirajo pa njegovo ime, zato ni treba skrbeti niti avtorju niti bralcem, da bi različne končnice imena datoteke lahko zmedle bralnik.

Če datotečni sistem omejuje končnico imena datoteke na tri velike črke, lahko izberemo npr.:

.L2  text/html;charset=ISO-8859-2
.646 text/html;charset=ISO646-YU
.852 text/html;charset=IBM852
.L2W text/html;charset=Windows-1250

Detajli nastavitev se razlikujejo med strežniki, ne bi pa smelo biti težko najti načina za dodajanje novih preslikav.

Primeri:

Za CERNov strežnik:

dodamo v datoteko httpd.conf naslednjo vrstico:
AddType .html-l2     text/html;charset=ISO-8859-2 8bit 1.0
in po potrebi še npr.:
AddType .html-646yu  text/html;charset=ISO646-YU    7bit 0.8
AddType .html-cp852  text/html;charset=IBM852       8bit 0.9
AddType .html-cp1250 text/html;charset=Windows-1250 8bit 0.9

Za NCSA strežnik:

dodamo v datoteko srm.conf naslednjo vrstico:
AddType text/html;charset=ISO-8859-2 .html-l2

Za Apache strežnik:

dodamo v datoteko srm.conf naslednjo vrstico:
AddType text/html;charset=ISO-8859-2  html-l2

Za multithreaded HTTP strežnik na OpenVMS:

v datoteko HTTP_SUFFIXES.CONF dodamo naslednjo vrstico:
suffix  .html-l2  text/html;charset=ISO-8859-2  8BIT  1.0

Za Microsoft Internet Information Server (Windows NT):

  1. vklopimo se kot Administrator
  2. poženemo regedt32
  3. izberemo: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
    Services\InetInfo\Parameters\MimeMap
  4. kliknemo Add Value na meniju Edit
  5. v polje Add Value vpišemo:
    text/html; charset=ISO-8859-2,html-l2,,h
  6. v polju Data Type izberemo REG_SZ in kliknemo OK
  7. polje String pustimo prazno in kliknemo OK
  8. ponovimo korake 4 do 7 in v koraku 5 vnesemo:
    text/html; charset=Windows-1250,html-cp1250,,h

Po spremembi konfiguracijskih datotek je verjetno treba strežnik na to opozoriti ali ga pognati znova. Sistem Windows NT je treba zagnati na novo.

Odslej bodo vse datoteke, ki se končajo na .html-l2, opremljene s HTTP headerjem Content-Type: text/html;charset=ISO-8859-2, vse tiste, ki se končajo na .html, pa bodo še naprej opremljene s Content-Type: text/html, kar implicira ISO Latin 1 nabor znakov.

Dinamični dokumenti -- CGI programi

Če gre za dokument, ki ga vsakokrat sproti sestavi nek naš CGI program (skript), je zadeva še preprostejša. CGI program mora vedno sam izpisati HTTP vrstico Content-Type:, zato lahko vanjo napiše kar želi oz. kar je potrebno.

Namesto da izpiše:

  Content-Type: text/html
mora izpisati:
  Content-Type: text/html; charset=ISO-8859-2
kadar na primer pošilja dokument v naboru ISO Latin 2.

Dva primera CGI programa za sprotno pretvorbo med nabori znakov:

Mimogrede naj omenim še en problem z dokumentom, ki se vsakokrat predela skozi CGI skript -- cache takih dokumentov noče hraniti, zato dostop do njih vedno zahteva zvezo z oddaljenim strežnikom, kar bolj obremenjuje omrežje in je počasno za uporabnika. Kljub nekoliko večji potrati diska na strežniku, so statični dokumenti s tega stališča prijetnejši za uporabnika.

Zaključek

Pokazali smo, da pri HTML dokumentih nabor znakov ISO Latin 2 pokriva potrebe Slovenščine po šumnikih in hkrati edini ustreza mednarodnim standardom in priporočilom za HTTP protokol. Pogoj je, da strežnik opremi glavo dokumenta s Content-Type: text/html;charset=ISO-8859-2 . Novejše verzije popularnih bralnikov znajo avtomatsko preklapljati med nabori znakov brez uporabnikove intervencije, hkrati pa znajo tudi preslikati nabor ISO Latin 2 v Windows-1250 na osebnih računalnikih, tako da na strani bralca ni potreben noben dodaten trud (npr. instalacija dodatnih fontov).

Pokazali smo tudi dve varianti, kako lahko na strani strežnika zagotovimo, da bodo dokumenti opremljeni z ustrezno Content-Type glavo -- za statične in za dinamične dokumente. Opisani metodi sta preprosti in ilustrativni, nikakor pa ne edini možni.

Dodatki

Tabela šumnikov za ISO Latin 2

Tule je kratka tabela s kodami šumnikov. Uporabiti je treba pravi 8-bitni znak z ustrezno kodo in ne HTML entity oblike &#nnn;, saj zanj načeloma velja, da se interpretira kot Unicode koda znaka (oziroma podmnožica ISO Latin 1), ne glede na Content-Type (tega se trenutno ne držijo vsi bralniki).
    desetiška osmiška |     desetiška osmiška
znak   koda    koda   | znak   koda    koda
----------------------+----------------------
  č    232     350    |   Č    200     310     (ch)
  š    185     271    |   Š    169     251     (sh)
  ž    190     276    |   Ž    174     256     (zh)
  ć    230     346    |   Ć    198     306     (cj)
  đ    240     360    |   Đ    208     320     (dj)

Več o ISO Latin naborih znakov se nahaja na: http://www.cs.tu-berlin.de/user/czyborra/charsets/

Ročna pretvorba med nabori znakov

Da ne vzdržujemo dokumentov ločeno v vsakem naboru znakov, vzamemo lahko za original npr. tistega v ISO Latin 2 in ga s preprosto pretvorbo predelamo v njegove izpeljanke -- namesto vsakokrat sproti (kot to dela CGI skript), to naredimo le ob spremembi vsebine.

Na Unixu npr. zamenjamo ISO Latin 2 v ISO Latin 1 (csz) z ukazom:

perl -p -e 'tr/\350\271\276\346\310\251\256\306/cszcCSZC/;' \
   my-file.html-l2 >my-file.html

Na CATHY pa npr. z ukazom:

$ exe perl -p -e "tr/\350\271\276\346\310\251\256\306/cszcCSZC/;" -
   my-file.html-l2 >my-file.html
Uporabimo lahko tudi program sumniki avtorja Branka Drevenška. Program je v javni lasti, na voljo je izvorna koda v C++, in prevedene (exe/bin) verzije za Windows 95 / Windows NT, DOS, OpenVMS in druge sisteme - glej Kako uporabljati slovenske črke v HTML dokumentih? (David Vrtin); tam so tudi navodila za nastavitev urejevalnika emacs za delo z Latin 2.

Reference

Domači dokumenti

Tuji dokumenti

Primeri uporabe opisanih konceptov

Povsod v naslednjih primerih je ohranjen koncept, da pri sklicevanju na druge dokumente (če obstajajo v različnih naborih znakov) vedno vstopimo v dokument z enakim naborom znakov.