Hvad er tegnkodning?

Computere håndterer alt i ettaller og nuller. Disse ettaller og nuller kan sættes sammen i rækkefølge, så de bliver til naturlige tal. For at kunne have bogstaver og andre tegn i en computer, må vi indføre begrebet tegnsæt (engelsk: "character set"), som kan repræsentere tegnene i de naturlige tal. Et tegnsæt giver imidlertid kun mulighed for at angive et enkelt tegn ad gangen. Vil vi have en hel tekststreng lagret i computeren, må vi yderligere inføre begrebet tegnkodning (engelsk: "encoding", "character encoding" eller "charset"), som sætter tegnene i et tegnsæt sammen i en rækkefølge.

Herunder er et eksempel hvor den binære streng 01001000­01100001­01101100­01101100­11000011­10111000­01101010­00100001 omsættes til teksten "Halløj!" ved hjælp af tegnkodningen UTF-8 (som er baseret på Unicode) .

0100100001100001011011000110110011000011101110000110101000100001
tegnkodning / character encoding : UTF-8
729710810824810633
tegnsæt / character set : Unicode
Halløj!
skrifttype / font : serif bold italic
Halløj!

Tegnsæt

Et tegnsæt (engelsk: character set) er en tabel, som sammenkæder en række tal med en række tegn. Tallet 1 kan fx sammenkædes med et lille A, 2 kan sammenkædes med et stort A, 3 kan sammenkædes med et procenttegn og så videre. Som du nok kan forestille dig, er der mange kombinationsmuligheder for tal og tegn. Et tegnsæt er en af disse kombinationsmuligheder.

Nogle af de mest anvendte tegnsæt:

US-ASCII
ASCII indeholder 128 tegn og kontrolkoder indekseret fra 0 til 127. Standarden indeholder kun amerikanske tegn.
ISO 8859-1
ISO 8859-1 er en udvidelse af ASCII. De første 128 tegn er de samme som i ASCII, men de er her efterfulgt af yderligere 128 tegn fra vesteuropæiske sprog (fx de seks tegn æ, ø, å, Æ, Ø og Å), så tegnsættet i alt kommer op på 256 tegn.
Unicode
Unicode er et tegnsæt, der indeholder et stort udvalg at tegn (flere tusinde). Målet er at tegnsættet skal indeholder bogstaver for alle alment anvendte sprog.

Tegnkodninger

Når vi har defineret et tegnsæt, er næste opgave at sætte tegnene sammen i en rækkefølge, så vi får en tekst. En sådan sammensætning af tegn kaldes en tegnkodning (engelsk: encoding eller character encoding).

Der findes et hav af forskellige tegnkodninger, her er de to du bør kende:

ISO-8859-1
Sætter tegnene fra ISO 8859-1 sammen i en række ved at lade ethvert tegn have en længde på 8 bit (tegnsættet har én bindestreg i navnet og tegnkodningen har to bindestreger). Da tegnkodningen er baseret på ISO 8859-1, er det kun muligt at bruge vesteuropæiske tegn i tekstfiler, som anvender denne tegnkodning. Tegnkodningen har også tilnavnet latin1.
UTF-8
Sætter tegnene fra Unicode sammen i en række. Ikke alle tegn har samme længde. Længden varierer fra 8 til 32 bit. Da tegnkodningen er baseret på Unicode, er det muligt at bruge stort set alle kendte tegn i tekstfiler, som anvender denne tegnkodning. Dette inkluderer kinesiske, arabiske og latinske skrifttegn (Latinske skrifttegn er dem vi bruger i det danske alfabet).

Når du skriver en tekst i en tekst-editor (eksempel: Notepad) og gemmer teksten i en fil, vil du normalt få mulighed for at vælge, hvilken tegnkodning filen skal gemmes i. Tegnkodningen er definitionen af tekst i en computer og er derfor et essentielt begreb i blandt andet tekst editorer. Alligevel er der nogle tekst-editorer, som kun understøtter en enkelt tegnkodning, og i nogle tekst-editorer er det svært at finde ud af, hvilken tegnkodning der anvendes.

Hvis du udelukkende skriver amerikansk tekst uden specielle tegn (det vil sige at alle brugte tegn findes i ASCII), er tegnkodningerne ISO-8859-1 og UTF-8 nøjagtigt ens. Dette blev oprindelig lavet for at lette overgangen fra ISO-8859-1 til UTF-8, men det har samtidigt betydet, at amerikanske udviklere ikke opdager, når de laver fejl i tegnkodningerne, og man kan derfor opleve fejl ved anvendelse af ikke-amerikanske bogstaver som fx Æ, Ø og Å i nogle programmer.

Byte Order Mark

Tekst, som er gemt i tegnkodninger baseret på Unicode, kan indeholde et Byte Order Mark (BOM), som fortæller hvilken udgave af tegnkodningen, der anvendes. For eksempel findes UTF-16 i to udgaver: Little Endian (LE) og Big Endian (BE). Hvilken af udgaverne angives i et BOM i begyndelsen af tekstfilen.

Mange tekst-editorer indsætter BOMs i filer, hvis de gemmes i visse tegnkodninger (typisk Unicode-baserede tegnkodninger). Det er sjældent at disse tekst-editorer fortæller brugeren, hvornår et BOM indsættes, eller giver brugeren mulighed for at vælge det til eller fra. Du skal generelt ikke anvende BOMs i forbindelse med webudvikling (eller udvikling generelt). Her er et eksempel skrevet i PHP:

<?php
echo 'Dette er a.php ';
include('b.php');
?>
<?php
echo 'Dette er b.php ';
?>

Hvis de to filer er gemt uden BOM, vil resultatet af a.php blive "Dette er a.php Dette er b.php ". Er der derimod BOM i begge filer, bliver resultatet "<BOM>Dette er a.php <BOM>Dette er b.php ". Her er det første BOM i orden, men det andet BOM i midten af filen er en fejl og kan give problemer.

Her er et andet eksempel:

<?php
header('Location: fil.php');
?>

Hvis der anvendes BOM her, vil header-funktionen fejle (afhængigt af indstillingerne for output buffering), fordi BOM allerede er sendt til klienten som en del af HTTP-bodyen.

Tegnkodningers betydning for webudvikling

Hvis din hjemmeside skal vises korrekt, er det vigtigt, at du fortæller browseren, hvilken tegnkodning du bruger. Du skal anvende den tegnkodning, som din teksteditor gemmer dine filer i. Mange hjemmesider glemmer at oplyse deres tegnkodning, og det resulterer i fejl.