itfag | Teknologi. Data. Læring. Deling.

apr/11

1

Unicode og utf-8

Av: Helge Hafting, høgskolelektor

I datamaskinens barndom skjedde mye av utviklingen i USA. Det var mange som lagde maskiner, og etterhvert så man et problem:

Filer laget på en maskin, kunne ikke brukes på maskiner fra andre leverandører.

Data ble lagret på hullkort og tape, og hver produsent hadde sin måte å gjøre det på. Et hullmønster som kodet «M» på en maskin, tolket en annen som «(», for eksempel.

Løsningen på dette problemet ble ASCII. Dette er en standard som spesifiserer hvordan 127 vanlige tegn skal kodes. Bl.a. sifre, store og små bokstaver fra A til Z, og en del andre tegn som punktum, komma og slikt. Datamaskiner standardiserte etterhvert på at 1 byte=1 tegn. Det gikk greit, for en byte har i alt 256 mulige verdier.

Dette fungerte for amerikanerne, men ikke for resten av verden. Bokstaver som «ÑÆß» var ikke tilgjengelige, for ikke å snakke om andre skriftsystemer som gresk, russisk, kinesisk og arabisk.

Det ble laget mange midlertidige løsninger. Noen byttet ut de minst brukte ascii-tegnene for å få «sine» ekstra bokstaver. Andre innså at en byte har 128 mulige verdier i tillegg til ascii, dermed kan man ha ascii + 128 andre tegn.

Den byte-baserte løsningen ble brukt en stund, men den hadde sine problemer. Kineserne har for eksempel over 30 000 tegn. Også europeerne har mer enn 128 tegn utover ascii, så det som var en «ú» på en norsk maskin, kunne bli en «Ż» på en latvisk maskin.

Den endelige løsninge ble unicode. Unicode er ikke byte-basert, og har plass til alle skrifttegn i alle språk. I tillegg kommer mengder av spesialtegn fra matematikk, typografi og annet.

Men unicode skapte et annet problem. Unicode gir hvert tegn et nummer, men sier ikke noe om hvordan tegnene skal kodes i datamaskinene. Man kunne brukt unicode-numre direkte, men det ville blitt upraktisk på mange vis:

  • En ville trengt 4 byte per tegn; de som klarer seg fint med ascii er dermed ikke interessert i å firedoble lagringsbehovet. De er heller ikke interessert i et inkompatibelt system hvor det ikke går an å lese de enorme mengdene med eksisterende tekst (og programkode) som er laget i ascii.
  • All programvare må skrives på nytt. Det er ikke bare det at tegn må representeres med en annen datatype. Mange programmeringsspråk bruker en byte med verdien 0 for å markere hvor i minnet tekststrenger slutter. Men når et tegn består av 4 byte, vil det bli en god del tegn som inneholder en byte eller to som er 0.

For å løse dette måtte man finne en god måte å representere unicode. Flere måter fins, men UTF-8 er en av de bedre. UTF-8 har mange praktiske egenskaper:

  • Tegn som finnes i ascii, kodes akkurat som før. Altså verdier fra 0–127, lagret i én byte. Dette gjelder også 0-tegnet, som brukes for å avslutte tekststrenger i programmer. Dermed er utf-8 bakoverkompatibelt med ascii.
          – Vi trenger ikke gjøre om på programmeringsspråk og kompilatorer
          – Vi trenger stort sett ikke gjøre noe med eksisterende kildekode
  • Tegn som ikke er i ascii, representeres med 2, 3, 4, 5 eller 6 byte. Dette er gjort på en slik måte at det første tegnet i sekvensen angir hvor mange byte det er. Resten av sekvensen består av byte-verdier kodet slik at programmet kan se at de er «fortsettelsestegn». Dermed er det lett for programmer å finne start og slutt på slike sekvenser, enten de går gjennom tekststrengene forlengs eller baklengs.
  • Tegn som trengs for å skrive engelsk, representeres med en byte per tegn. Tegn som trengs for andre europeiske og arabiske språk trenger to byte per tegn. Det gjelder både bokstaver som «æøåü», og greske/kyrilliske/arabiske/hebraiske alfabeter. Alle andre levende språk kan skrives med tre tegn per byte. Fire eller fler byte per tegn trengs stort sett bare for historiske språk.

Tabell som viser bitmønstrene som brukes i UTF-8. I første byte angir antall bit som er 1, hvor mange byte som er i tegnet. Resterende bytes begynner med 10 for å angi at de er fortsettelse på et tegn. Biter markert som «x» angir tegnnummeret i unicode.

Klikk på bildet for stor versjon

UTF-8 har blitt en suksess, om lag halvparten av alle nettsider er i utf-8. Resten er fordelt på mange andre kodesystemer, mange av dem er gamle systemer som er på vei ut. (windows codepages, mac, diverse iso8859-x)

Med utf-8 er det ikke noe problem å blande mange skriftsystemer i samme dokument eller tekstfil:

Norsk æøå ÆØÅ
Kyrillisk Moskva: Москва́, Kiev: Київ
Gresk Athen: Αθήνα, Parthenon: Παρθενών
Kinesisk Bejing: 北京 Shanghai: 上海

Hvilken erfaring har du med utf-8? Har du eksempler på problemer som kan oppstå for eksempel i web- eller programmeringssammenheng?

Dette innlegget har 2 kommentarer. Gjerne bidra :-)

Skrevet av: itfag (totalt 65 blogginnlegg)

2 comments

  • Geir Arne Aasen · 4. april, 2011, kl. 14:27

    Jeg hadde problemer for en tid tilbake hvor forksjellige nettlesere gjorde forskjellige antagelser med hensyn til hvilket tegnsett som skulle brukes ved sending av data fra et HTML-skjema. Det lagde problemer for meg når jeg genererte en checksum av passordstrengen for lagring i databasen, da checksum ble forskjellig avhengig av hvilket tegnsett som ble brukt. Løsningen var å normalisere passordstrengen (på serversiden) til å alltid bruke UTF-8 både ved generering av checksum og sjekking av denne.

  • Author comment by Svend Andreas Horgen · 5. april, 2011, kl. 14:33

    Her er en interessant gjennomgang av samme tema men vinklet mot webutvikling, anbefaler å lese siste del ca 2/3 nede på siden:
    http://www.joelonsoftware.com/articles/Unicode.html

<<

>>

Theme Design by devolux.nh2.me