Encoding

Jeg faldt over dette blogindlæg i dag http://technigal.wordpress.com/2007/07/16/natural-language-processing-the-indian-perspective/, som handler om nogle af de konkrete problemstillinger, Indien har ved at være et land, der består af mange forskellige grupper med hvert deres sprog.

Som artiklen er inde på har en af løsningerne på problemet allerede set dagens lys: Unicode. For helt at fange fidusen med Unicode, er det vigtigt at huske på, at en computer ikke kan forstå tekst, kun tal – ja, kun 1-taller og 0’er. Når en tekststreng derfor skal gemmes, skal den kodes som en række tal, og hvad der er lige så vigtigt: når den skal hentes frem igen, skal modtageren være enig med afsenderen om, hvordan teksten er kodet – ellers opstår situationer som denne:

Encoding - Der er opstået en fejl, prøv igen senere

Her har afstenderen glemt at informere modtageren om, hvordan teksten er kodet. De fleste tegn kan modtageren ‘gætte’ sig frem til, men over for specialtegnene æ, ø og å giver modtageren op – de kan være kodet som hvad som helst, og for computeren er der ikke større sandsynlighed for, at det er et æ, end at det er et tilfældigt japansk tegn.

Lidt historie for at forstå nutiden

Førhen blev tekst kodet med 7 bit – det vil sige en række af syv 1-taller og 0’er. Fx svarede tegnet A til 65, som omskrevet til det binære talsystem svarede til 100001.

Dette tegnsystem kaldes ASCII og har den meget store begrænsning, at det kun kan indeholde 128 forskellige tegn (svarende til 128 forskellige måder at kombinere 7 på hinanden følgende 1-taller og 0’er). Dog har det samtidig den store fordel, at dets tegn svarer til dem, der anvendes i engelsk/amerikansk. I en globaliseret verden er 128 forskellige tegn dog langt fra tilstrækkeligt.

Der blev på et tidspunkt skabt præcedens for at gruppere bits i bytes således at 8 bit svarede til én byte. Samtidig gik det binære talsystem af mode, og man indførte i stedet et hexadecimalsystem. I vores normale titalssystem (decimalsystemet) har vi tal fra 0-9, men i et hexadecimalsystem anvender man tal fra 0-15. Derfor noteres hexadecimalsystemet med tal fra 0-9 samt bogstaverne A-F for hhv. tallene 10-15. Hexadecimalsystemet er egentlig bare en praktisk måde at forkorte det binære talsystem på. Eftersom bits altid grupperes i bytes, der består af 8 bit, kan en byte blive repræsenteret med 2 hexadecimaltal, hvor hvert ciffer svarer til fire bits – også kaldet en nibble. I stedet for at skrive bogstavet A som 1000001 kan det således i stedet forkortes til 41, hvor 4-tallet repræsenterer nibblen: 0100, og 1-tallet repræsenterer 0001.

Men hov – i den binære ASCII-kodning svarede A til 1000001, mens det samme skrevet med hexadecimalsystemet svarer til 41, som igen svarer til 01000001. Det er det samme tal, men med et 0 foran. Det betyder, at man ved at gruppere bits i bytes for hver byte havde en bit, man ikke brugte til noget – denne bit vil altid være 0, så længe tekst kodes med ASCII-kodning. IBM fandt derfor på at udvide ASCII-kodningen til at kunne rumme 256 forskellige tegn, så man dermed gjorde brug af den ekstra bit. Dette system blev meget udbredt, og der opstod en situation, hvor alle var enige om de første 128 tegn, men de sidste 128 tegn, verden med ét havde fået i overskud, blev anvendt vidt forskelligt fra sprogområde til sprogområde. I Danmark var det naturligt bl.a. at anvende tegnene til æ, ø og å, men sendte man et elektronisk dokument til USA, ville de talkoder, der med en dansk udvidelse af tegnsættet betød æ, ø og å, betyde noget helt andet.

Unicode: Før Babelstårnet vælter

Systemet med 128 faste tegn + 128 nationalt bestemte tegn holdt i mange år, men især internettet og den stigende overførsel af digitaliseret tekst har gjort det særdeles uholdbart med kun 256 forskellige tegn – især fordi halvdelen af disse tegn betyder noget forskelligt fra land til land.

I eksemplet ovenfor har BaneDanmarks hjemmeside givet en fejlmeddelelse, hvor browseren har erstattet æ, ø og å med spørgsmålstegn. Når browseren kunne gætte sig frem til de øvrige, almindelige vestlige tegn, er det således historisk betinget. Det er, fordi man altid har været enig om de første 128 tegn, som bl.a. består af tal samt bogstaverne fra a-z og A-Z. De øvrige tegn har man tilgengæld altid været uenige om kodningen af.

Unicode er løsningen på dette sprogvirvar. Unicode er en relativt kompleks standard, og derfor vil jeg kun beskrive den overfladisk (og delvist fejlagtigt). Finden med Unicode er basalt set at udvide kodningen af tegn fra 1 til 2 bytes. Mens ASCII-tegnsættet og dets efterfølger kunne skrives med 1 byte, så skrives Unicode-tegn groft sagt med 2 tegn. I stedet for 41 for A ville man skrive 0041. Husk, at overgangen fra 128 til 256 tegn blev skabt, fordi man havde 1 bit i overskud. Hver gang man kan finde en bit mere at kode et tegn med, bliver der med andre ord åbnet op for dobbelt så mange tegn. 7 bit giver således 2 opløftet i 7 = 128 muligheder, mens 8 bit giver 2 opløftet i 8 = 256 muligheder. Med en hel byte mere har man pludselig (igen groft sagt) 2 opløftet i 16 = 65.536 forskellige tegn. Men det er ikke hele historien. Unicode-standarden er som sagt kompleks, og den kan kodes på flere forskellige måder. Et af unicodeformaterne anvender faktisk 4 bytes svarende til 2 opløftet i 32 = ca. 4 milliarder forskellige tegnkombinationer. Unicode-standarden indeholder således et tegnsæt, der rummer alle tegn i hele verden samt tegnsæt for nogle ikke-eksisterende sprog såsom fantasisproget Klingon.

Blandt andet derfor er Unicode så helt igennem fantastisk. En anden superfin feature ved Unicode er, at det kan kodes relativt med 1 bytes. Det vil sige, at de tegn, der ikke behøver at fylde mere end 1 bytes, kun fylder 1 byte, mens mere komplekse tegn kan fylde op til 4 bytes. Disse forskellige kodninger benævnes UTF eller Unicode Transformation Format, og den netop nævnte relative kodning med 1 byte benæves UTF-8, fordi der går 8 bit på en byte. UTF-8 er ved at blive den mest anvendte kodning af hjemmesider.

Men der er jo altid et men

Unicode er en abstraktion. Okay, hvad i alverden betyder det? Man kan tænke på det med en metafor hentet fra Platon – Unicode-tegnet A er ikke et fysisk A, men en idé om et A. Hvis et stykke software ved, at det skal forstå en bestemt tegnkode som A, fx 0100 0001, så forstår det idéen A, men det ved principielt ikke noget om, hvordan A’et skal skrives, hvordan det ser ud med fed skrift osv. Det er her skrifttyper eller fonte kommer ind i billedet. En font er en konkret repræsentation af et tegn fra et tegnsæt – men hvis ikke du har en font på computeren, som kender et tegn, så hjælper det ikke, at softwaren godt ved, hvad det er for et tegn – det vil groft sagt aldrig være i stand til at fortælle brugeren det. Det må så enten vælge et andet tegn, typisk en firkantet boks eller et spørgsmålstegn, eller det må udelade tegnet.

Hvor kom vi egentlig fra?

Okay, alt det her tekniske snak er et forsøg på at konkretisere, hvilke sprogteknologiske problemer der forekommer i lande, hvor man taler mange forskellige sprog og er afhængig af at kunne udveksle dokumenter digitalt. Det er jo meget godt med et stærkt redskab som Unicode, der kan rumme alle tegn på én gang, men det hjælper jo ikke på alle de historiske dokumenter, der i forvejen er kodet med tidligere tiders tegnsæt. Her er modtageren af dokumenterne afhængige af både at have installeret de korrekte tegnsæt på sin computer og af at have nogle skrifttyper, der kan visualisere tegnene. Og for at det ikke skal være løgn, så kan nogle tegnsæt ikke eksisterer side om side på en pc (eller det kunne de ikke førhen i de glade DOS og Windows 3.x-dage – måske man har fået redskaber til det nu?), så i enkelte tilfælde skal man have én pc til nogle sprog, en anden til andre sprog. Bottom line: Tak Unicode!

3 responses to “Encoding

  1. Jeg er netop stødt på endnu en morsom encoding-fejl. Denne gang i Google Analytics. På siden http://www.defynskemalere.dk havde jeg implementeret Google Analytics, hvorefter jeg konstant modtog en JavaScript-fejl.

    Hvorfor fejlen præcist opstod, har jeg ikke undersøgt nærmere, men det viste sig at have en sammenhæng med, at siden var kodet med UTF-7 encoding, hvilket også var angivet i et meta-tag. Da jeg ændrede sidens encoding til UTF-8 (ved at åbne den i NodePad++, ændre kodningen, rette specialtegnene og gemme den igen), forsvandt javascript-fejlen fra Google Analytics…

    Det er da meget rart, at selv Google kan lave encoding-fejl:)

  2. Pingback: Æ, ø og å på hjemmesider « Sproglige former

  3. Pingback: thomasklok.dk » HTML – æ, ø og å på hjemmesider…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s