Teckenkodning för nybörjare

Question

Vad är en teckenkodning, och varför ska jag bry mig om sådant?

Answer

Först, varför ska jag bry mig om detta?

Om du använder något mer än de mest enkla tecken som förekommer i västerländska språk, så kanske folk inte kan läsa din text, om du inte talar om vilken teckenkodning du använt.

Du kan till exempel ha avsett att din text ska se ut som detta:

mojibake1.gif

men den kan faktiskt visas som detta:

mojibake2.gif

Inte nog med att otillräcklig information om kodning kan sabotera läsbarheten av uppvisad text; det kan också betyda att din data inte kan hittas genom sökning på webben, eller bearbetas på meningsfullt sätt.

Så vad är en teckenkodning?

Ord och meningar i text byggs upp med tecken. Exempel på tecken är á i det latinska alfabetet, och det kinesiska ideogrammet och tecknet i devanagari.

Tecken grupperas i en teckenuppsättning (även kallad en repertoar). Detta kallas en kodad teckenuppsättning då varje tecken tilldelas ett visst nummer, kallad tecknets kodpunkt. Dessa kodpunkter representeras i datorn av en eller flera byte.

Teckenkodningen är den nyckel som knyter kodpunkter till till bytes i datorns minne, och som kan avbilda bytes tillbaka till kodpunkter.

Detta innebär helt enkelt att du kan visualisera detta som om tecknen lagras i datorn som en kod, ungefär som ett chiffer används av spioner. En teckenkodning är en nyckel för att låsa upp (dvs "knäcka") koden. En sådan nyckel är en uppsättning avbildningar mellan de byte som representerar tal inne i datorn, och tecken i den kodade teckenuppsättningen. Utan nyckel kommer data inte att se meningsfullt ut.

Den lite vilseledande termen charset används ofta för vad som i verkligheten är teckenkodningar. Du bör vara medveten om denna användning, men använd hellre termen teckenkodningar för detta.

Tyvärr finns det många olika teckenuppsättningar och teckenkodningar, dvs många olika sätt att relatera bytes, kodpunkter och tecken till varandra. Avsnittet Ytterligare information ger mer detaljerad information om detta, till de som är intresserade.

I de flesta fall behöver du inte känna till alla detaljer i detta. Du behöver bara försäkra dig om att du följer de råd som anges i avsnittet Hur påverkar detta mig? nedan.

Vilken roll har typsnitt i detta?

Ett typsnitt är en samling definitioner av glyfer, dvs definitioner av vilka former som ska användas för att visa tecken.

När din tillämpning har tagit reda på vilka tecken den ska hantera, så letar den i typsnittet efter glyfer, för att kunna visa eller skriva ut dessa tecken. (Om informationen om kodningen är felaktig, så kommer den naturligtvis att använda glyfer för fel tecken.)

Ett typsnitt gäller vanligtvis enbart för en viss teckenuppsättning, eller, då det handlar om stora teckenuppsättningar som Unicode, enbart en delmängd av alla tecknen i denna teckenuppsättning. Om ditt typsnitt inte har en glyf för ett visst tecken, så kan vissa tillämpningar hämta det saknade tecknet från ett annat typsnitt på ditt system (vilket betyder att glyfen utseendemässigt skiljer sig från den omgivande texten, ungefär som en text av hopklistrade tecken ur en tidning). Annars får du istället typiskt se en liten fyrkant, ett frågetecken, eller något annat tecken. Till exempel:

mojibake3.gif

Hur kommer detta att påverka mig?

Om du är en författare eller utvecklare av innehåll så bör du alltid välja teckenkodningen UTF-8 för ditt innehåll eller data. Denna Unicode-kodning är ett bra val, eftersom du kan använda en enda kodning för att hantera nästan alla tecken som du kommer att behöva. Detta innebär en drastisk förenklíng. Att överallt i din tillämpning använda Unicode eliminerar även behovet att spåra och konvertera mellan olika teckenkodningar.

Innehållsförfattare måste ta reda på hur man deklarerar teckenkodningen för det dokumentformat du arbetar med.

Lägg dock märke till att det inte räcker med att deklarera en annan kodning i din webbsida för att representationen av dina tecken ska ändras; du måste även spara texten i den angivna kodningen. Författare av innehåll måste ta reda på i vilken kodning som deras redigeringsverktyg eller skript sparar text, och hur du sparar text i UTF-8. Du kan också behöva kontrollera att din webbserver levererar dokument med rätt HTTP-deklarationer.

Utvecklare måste säkerställa att de olika delarna av systemet kan kommunicera med varandra, förstå vilka teckenkodningar som används, och stödja alla använda kodningar och tecken. (Helst bör du använda UTF-8 överallt, och därmed slippa bekymmer.)

Länkarna nedan leder till mer information om dessa teman.

Ytterligare information

Detta avsnitt ger, för den intresserade, lite ytterligare information om avbildningar mellan bytes, kodpunkter och tecken. Om du vill, så kan du hoppa direkt till avsnittet Mer att läsa.

I den kodade teckenuppsättning som benämnes ISO 8859-1 (även kallad Latin1) är 233 decimalformen av värdet för kodpunkten för tecknet é. I ISO 8859-5 representerar dock samma kodpunkt det kyrilliska tecknet щ.

Dessa teckenuppsättningar innehåller färre än 256 tecken, och de avbildar kodpunkt direkt till byte-värde. Och alltså representeras en kodpunkt med värde 233 av en enda byte med värdet 233. Lägg dock märke till att denna byte representerar antingen é eller щ, beroende på sammanhanget.

Det finns andra sätt att hantera tecken i andra skriftsystem. Med teckenuppsättningen Unicode kan du till exempel representera båda dessa tecken i samma teckenuppsättning. Unicode innehåller faktiskt, i en enda teckenuppsättning, de flesta tecken som du kommer att behöva använda. Värdet 233 står här fortfarande för é, men det kyrilliska tecknet щ har nu en kodpunkt med värdet 1097.

Å andra sidan är 1097 ett altför stort tal för att representeras av en enda byte*. Så om du använder den kodning för text i Unicode som kallas UTF-8, så kommer щ att representeras med två bytes, men värdet för kodpunkten är inte det man får av att bara lägga dessa dessa bytes efter varandra – en mer komplex avkodning behövs.

Andra Unicode-tecken representeras av en, tre eller fyra byte i UTF-8-kodningen.

Lägg dessutom märke till att tecknet é faktiskt representeras av två bytes i UTF-8, inte av en enda byte som görs i ISO 8859-1. (Endast ASCII-tecken kodas med en enda byte i UTF-8.)

UTF-8 är det mest använda sättet att representera Unicode-text i webbsidor, och du bör alltid använda UTF-8 när du skapar dina webbsidor och dina databaser. Men i princip är UTF-8 bara ett av flera olika sätt att koda Unicode-tecken. Med andra ord, en viss kodpunkt i teckenuppsättningen för Unicode kan faktiskt avbildas till olika byte-sekvenser, beroende på vilken kodning som använts för dokumentet. Kodpunkter i Unicode kan avbildas till bytes genom att använda någon av de kodningar som kallas UTF-8, UTF-16 och UTF-32. Devanagari-tecknet , med kodpunkt 2325 (som är 915 i hexadecimal notation), representeras av två bytes i UTF-16-kodningen (09 15), tre bytes i UTF-8-kodningen (E0 A4 95), och fyra bytes i UTF-32-kodningen (00 00 09 15).

Det kan finnas ytterligare besvärligheter utöver de som beskrivs i denna sektion (t.ex. ordning av bytes, och specialsekvenser), men de detaljer som givits här visar varför det är viktigt att den tillämpning du arbetar med känner till vilken teckenkodning som bör tillämpas på dina data, och att den har funktionalitet för att hantera den kodningen.