Menu
• Indhold

Tegnsæt på web

Resumé

Af Kell Sønnichsen, UNI-C
01/09 2003

Kan man vise både danske æ, ø, å, kyrilliske og græske bogstaver på samme webside? Ja, det kan man godt, men det kræver en smule omtanke, når man laver siden, så man får fortalt browseren, hvilket tegnsæt, der bruges.
I denne artikel sætter vi os for at lave en webside, hvor en russer bestiller blåbærgrød på en græsk restaurant.

 

Hvad er et tegnsæt?

Latin-1 tegnet 43 Første opgave er at kunne lave en HTML-fil, der indeholder både danske, russiske og græske tegn på samme tid. Hvis vi forsøger med hovedet under armen og bare skriver løs i Notepad/Notesblok - og f.eks. vha. Microsoft Visual Keyboard får et græsk og russisk tastatur, så vi kan taste de respektive tegn - og blot gemmer filen, så vil resultatet blive dårligt. Alle ukendte tegn bliver lavet om til '?'.

 

Det gælder om at gemme filen med det rette tegnsæt.

 

Et tegnsæt er en oversættelse af bogstaver, cifre og andre tegn til tal. Et eksempel er ISO-8859-1 (Latin-1) tegnsættet, hvor f.eks. 'C' er repræsenteret ved tallet 43, mens 'u' er repræsenteret ved tallet 117. Det er også dette tegnsæt, der er blevet standard på World Wide Web, og det dækker de fleste bogstaver i vesteuropæiske sprog, deriblandt æ, ø og å, hvorfor vi sjældent har problemer med at bruge disse bogstaver på websider.

 

Problemet er nu, at Latin-1 er et en-byte tegnsæt, og mængden af forskellige tegn var derfor begrænset til 256. Latin-1 indeholder bogstaver tilhørende de vesteuropæiske lande, deriblandt også æ, ø og å. Der findes så andre tegnsæt, der indeholder andre end danske tegn, bl.a. ISO-8859-7 til græsk og ISO-8859-5 til kyrillisk, men de kan ikke bruges sammen, så vi kan ikke umiddelbart benytte kyrilliske og danske tegn på samme webside.

 

Så vi må have fat i et tegnsæt, hvor der er plads til alle.

Om Hvad er et tegnsæt?

Nyhedsbrev

Tilmeld dig til IT-temaets nyhedsbrev



 

Artikler af

Kell Sønnichsen
 (11/07 2007)

 

Unicode - løsningen på alle problemer?

Unicode tegnet 0634 (hex) I 1991 blev der lavet et tegnsæt, Unicode, bestående af 2 bytes pr. tegn. Dette giver 65536 mulige tegn, hvilket er rigeligt til at indeholde de fleste tegnsæt, inklusive græske, hebræiske, arabiske og kyrilliske tegn. Så nu er alle vores problemer løst: med Unicode kan vi skrive både danske, græske og kyrilliske tegn på en og samme webside.

 

Men det fylder altså dobbelt så meget som en-byte tegnsæt, og det er ikke bagud kompatibelt med f.eks. Latin-1.

 

For at løse dette benytter man i praksis UTF-8, som er en komprimeret version af Unicode. For "normale" tegn, såsom bogstaverne fra A til Z, benyttes kun en enkelt byte, der ovenikøbet har samme værdi som i Latin-1. Således repræsenteres 'C' ved tallet 43 i både Latin-1 og UTF-8. Det betyder at en (engelsk) tekst ikke vil fylde mere i UTF-8 end i Latin-1. Man vil ovenikøbet ikke kunne se forskel; den er altså bagud kompatibel.

 

Mere specielle tegn, såsom æ, ø og å, fylder to bytes, mens meget specielle tegn kan fylde op til 4 bytes.

Så vi vil bruge UTF-8 i stedet for Unicode.

 

Hvordan skriver man så med UTF-8?

I vores første forsøg tænkte vi ikke på, hvilket tegnsæt, vi skrev med. Blot vi kunne skrive æ, ø og å og de forskellige kyrilliske og græske tegn, var vi tilfredse. Som vi kan se, gik det ikke godt, da vi gemte, for oftest vil det være i Latin-1. I de senere år er der kommet programmer frem, hvor man selv kan bestemme, hvilket tegnsæt, der skal gemmes i:

  • Wordpad har siden Windows 98 givet mulighed for at gemme i UTF-8, og i Windows 2000 kan Notepad (Notesblok) det samme.

  • Af mere avancerede webredigeringsprogrammer kan nævnes at FrontPage 2000, Adobe GoLive 5 samt Netscapes Composer 6 understøtter UTF-8.

  • Endelig kan Internet Explorer faktisk også bruges til at lave HTML-sider med UTF-8 tegnsæt ved at gemme filen i dette tegnsæt.

 

I alle tilfælde gælder, at det dog ofte er noget, man selv skal være opmærksom på at gøre, hvorfor det er en kilde til fejl.

 

Generelt kan man sige, at hvis man er i stand til i sit redigeringsprogram at skrive både danske tegn og andre tegn, der ikke findes i Latin-1, f.eks. kyrilliske, så er det et godt bud, at programmet kan gemme teksten i UTF-8. Faktisk så blev jeg nødt til at lave et enkelt krumspring for at gemme det første forsøg i Latin-1. Notepad advarede nemlig, idet den godt kunne se, at de græske og kyrilliske tegn ikke kunne repræsenteres i Latin-1.

Så vi gemmer nu den samme fil i UTF-8.

 

Kan browseren forstå det?

Så det rigtigt ud? Måske, måske ikke. Det afhænger af, hvor god din browser er til at gætte.

 

Alle moderne browsere, dvs. fra Netscape/Internet Explorer 4 og fremefter, kan forstå mange forskellige tegnsæt, deriblandt UTF-8, og har dermed en mulighed for at vise indholdet af en side korrekt. De er - som oftest - sat op til automatisk at bestemme tegnsættet, og det går - som oftest - godt.

 

Fra den græske Yahoo En god hjælp til at det kan gå godt er, at forfatteren af siden fortæller browseren, hvilket tegnsæt, der er brugt. Det gør man bedst ved at angive det i HTTP-headeren. Da denne header sættes af web-serveren, er det sjældent, at man har mulighed for at gøre det direkte. I så fald må man ty til inddirekte metoder, og her kommer metatags ind i billedet. Ved at tilføje følgende i starten af HTML-filen - inden for <head> tag'en - sikres at browseren bliver gjort opmærksom på, at indholdet er i UTF-8:

 


<meta http-equiv="content-type" content="text-html; charset=utf-8">

 

Den græske Yahoo som den bør se ud Et godt eksempel på, hvor det ikke er gjort korrekt, er den græske Yahoo ( gr.yahoo.com). Her er indholdet skrevet med ISO-8859-7 (ikke UTF-8, princippet er dog det samme), men det fremgår hverken af HTTP-headeren eller af en metatag i HTML-filen. Og så ser det i min browser ud som ovenfor, idet den så bruger default tegnsæt, der er Latin-1. Hvis jeg i min browser selv sætter tegnsættet til græsk, så ser det korrekt ud, som det ses her til højre.

 

Det samme gælder vores webside, som vi forfattede i forrige afsnit. Hvis vi ikke fortæller, at der er brugt UTF-8, så ser det muligvis ikke korrekt ud. Katastrofen er ikke helt så stor som ved det græske, fordi så mange tegn er fælles for UTF-8 og Latin-1, så det er næsten læsbart. Men vi ser, at de to bytes, der i UTF-8 bruges til at repræsentere f.eks. 'æ', bliver vist som de tilsvarende to tegn i Latin-1 tegnsættet (Ã|).

 

Når browseren fortolker UTF-8 som Latin-1 Når vi nu indsætter metatag'en, så ser vores webside rigtig ud. Eller måske ikke … Hvad gik der galt?

Hvis tegnsættet også er sat i HTTP-headeren, så er det - desværre - det, som står i den, der  "vinder". I dette tilfælde står der:

Content-Type: text/html; charset=iso-8859-1

Og så vil browseren forsøge at vise indholdet som Latin-1 tekst.

 

Vi bliver derfor nødt til at have så meget magt over HTTP-headeren, at den i det mindste ikke fortæller noget som helst, når den nu ikke fortæller det rigtige. Grunden til at serveren - en Apache - i det hele taget udtaler sig om tegnsættet er pga. en lille sikkerhedsrisiko, som jeg ikke vil komme nærmere ind på. Men vi bliver nødt til at blive så gode venner med systemadministratoren, at han vil give os lov til at ændre på denne opførsel. Det gør han ved at sætte følgende ind et passende sted i konfigurationen af Apache:

AllowOverride FileInfo

Så kan vi nemlig slå den fejlagtige information i HTTP-headeren fra ved at lave en .htaccess fil i det directory, hvor vi har vores UTF-8 filer liggende. Filen skal blot indeholde følgende linje:

AddDefaultCharset off

Nu vil Apache ikke længere i HTTP-headeren fortælle, hvilket tegnsæt, der er brugt, og så kan vores metatag i selve filen få betydning.

Endelig ser vores side rigtig ud.

 

Kan browseren vise det?

Nu har vi sikret os, at browseren kan forstå, at vores webside er skrevet i UTF-8. Men for at vise alle de mulige tegn i UTF-8, så er det nødvendigt at have de rigtige fonte installeret på sin maskine. Hvis du i eksemplet ovenfor, hvor vores webside skulle se rigtig ud, så rektangler i stedet for enten kyrilliske eller græske tegn, så var der netop et problem med en eller flere manglende fonte.

 

Telugu tekst, hvor den korrekte font ikke er installeret Selv måtte jeg helt til Sydindien for at finde et eksempel, der går galt på min maskine. Jeg har både græske, kyrilliske, hebræiske, kinesiske og japanske fonte installeret, men ikke en font hørende til det sydindiske sprog, telugu. Bemærk, at eksemplet rent faktisk er skrevet i UTF-8, hvilket også fremgår af metatag'en, men visningen går galt pga. den manglende font.

 

Det er desværre her, at slutbrugeren kan tabes. Hvis han ikke har den rigtige font installeret, vil han - uanset vores indsats - kun se rektangler. Heldigvis vil både Internet Explorer og Netscape normalt tilbyde at downloade og installere en evt. manglende font, når den får brug for det.

 

Så det kan altså lade sig gøre!

Vi har nu en webside med det ønskede resultat. For at nå det gjorde vi følgende:

  • Skrev og gemte websiden i UTF-8 tegnsættet.
  • Tilføjede en metatag, der fortæller browseren, at indholdet er skrevet i UTF-8.
  • Fik webserveren til ikke at angive noget tegnsæt (så metatag'en kan få betydning)
  • (Evt. installere de manglende fonte i browseren)
 

Relevante links