Om teckenkodning – små tecken som gör stor skillnad

Om teckenkodning - små tecken som gör stor skillnad

Bakom stora och komplexa system behövs det kompetens och människor som har full koll på struktur, datasäkerhet, standarder osv. Följ med bakom spakarna när Christian Davén, IT-arkitekt på Alfa eCare, berättar den fascinerande och för många helt okända berättelsen om teckenkodning. Något som vi alla är mer eller mindre beroende av att det ska fungera och som finns i våra telefoner och runt oss, i olika datasystem, utan att vi ens vet om det.

teckenkodning-artikel

Utan teckenkodning kan det bli väldigt fel

När euron skulle införas i slutet av 90-talet behövde man ett nytt tecken för den nya valutan. Efter en designtävling bestämde men sig för tecknet €. Problemet var att detta tecken än så länge inte kunde skrivas på någon dator eller i ett sms någonstans i hela världen eftersom det var påhittat och helt nytt.

I vissa telefoners sms byttes först tecknet ¥ (för de japanska och kinesiska valutorna yen och yuan) ut mot €. Föreställ dig förvirringen när ditt erbjudande eller anbud på ¥1000 en dag har skrivits om av telefonleverantören till €1000! På Windows- och Mac-datorer tog man helt enkelt bort något tecken man bedömde som mindre viktigt och ersatte med €. 

Denna hastiga implementation var inte globalt koordinerad och ibland kunde mottagaren se ditt €-tecken som ¥, ¤ eller ?. Hur kom det sig att detta blev ett problem och hur löstes det?

Kodning av tecken

En teckenkodning är ett sätt att översätta bokstäver, siffror och andra tecken till ”koder”, ”ettor och nollor”, eller numeriska värden. Bokstaven A kodas vanligtvis som 01000001 (65), B som 01000010 (66) och så vidare.

Teckenkodningarnas förfader var Morsealfabetet som översatte bokstäver och siffror till långa och korta signaler (”koder”) som kunde skickas över telegraftrådar eller radiovågor. Morsealfabetet innehöll ursprungligen bara det engelska alfabetet men ganska snabbt skapades internationella och nationella varianter med flera bokstäver. Om avsändaren och mottagaren använder olika alfabet skulle morsealfabetet bli oläsligt. 

På samma sätt fungerar det idag. Om jag skriver en text på min dator eller telefon och skickar den till dig, kommer du bara se samma sak som jag ser om våra enheter använder antingen samma teckenkodning eller lyckas översätta korrekt mellan min och din teckenkodning.

När olika system ska integreras och skickar datafiler mellan sig måste man ha koll på teckenkodningen. Annars riskerar man att istället för Å, Ä, Ö läsa in �, �, �.

Mojibake

Att datorer råkar visa skräptecken istället för det ursprungliga meddelandet är så vanligt att man i Japan har hittat på ett uttryck för det; Mojibake. Det betyder ungefär teckenförändring. Ett exempel är när ”Smörgås” visas som ”SmörgÃ¥s”.

Men varför visas text ibland med en annan teckenkodning än den som användes när man sparade texten? Varför kan inte datorn visa ”rätt”?

Det är så enkelt som att ”man” inte talar om vilken teckenkodning man använder utan bara antar att mottagaren kommer använda samma teckenkodning. På samma sätt antar mottagaren att avsändaren använder samma teckenkodning.

Standarden Unicode

Situationen med hundratals olika teckenkodningar över hela världen, var och en med stöd för 256 tecken och enstaka alfabet, är långt ifrån idealisk. Ett stort steg i rätt riktning är standarden Unicode – som har plats för drygt en miljon tecken! I dagsläget har man dock ”bara” lagt in knappt 150 tusen tecken från alfabet över hela världen, valutasymboler, matematiska tecken, pilar och geometriska former – och emojis.

Varje tecken har i Unicode ett namn och en kod, och tillhör olika kategorier av tecken. Exempelvis har bokstaven Å koden U+00C5 och namnet Latin Capital Letter A with Ring Above. Det är ett fantastiskt ambitiöst arbete som har gjorts.

Ironiskt nog har Unicode i sin tur orsakat förvirring, eftersom det är en standard med många implementationer. Unicode översätter alltså från alla möjliga tecken till koder, men hur dessa koder sedan lagras är en detalj som kan lösas på olika sätt. SMS med Unicode implementerades först med kodningen UCS-2, men på grund av att UCS-2 inte har stöd för emojis, så bytte man till UTF-16. (Ja, emojis är helt vanliga tecken, som standardiseras genom Unicode. Det är inte små bilder, som man skulle kunna tro! Se https://unicode.org/emoji/charts/emoji-list.html)

På webben har UTF-8 helt tagit över, och används nu på 98% av alla webbplatser.

Skillnaden mellan UTF-8 och UTF-16

UTF-8 är bakåtkompatibel med ASCII, en teckenkodning som togs fram på 1960-talet som en digitalisering av Morsealfabetet, och som har blivit alla teckenkodningars stamfader.

Det är snudd på genialiskt att lyckas göra en teckenkodning som både har stöd för hela Unicode och samtidigt är bakåtkompatibel med 7-bitars ASCII. Dessutom är det den Unicode-implementation som kräver minst lagringsutrymme. UTF-16 lagras alltid med två eller fyra bytes för varje tecken. Exempelvis måste man använda två bytes för att representera ett Å och fyra bytes för tecknet Grinning Face (😀).

UTF-8 ”expanderar” smidigt från en till fyra bytes beroende på tecknens kod. Det engelska alfabetet kan lagras med bara en byte per tecken, medan exempelvis Å, Ä och Ö kräver två byte. Grinning Face lagras med fyra bytes, precis som med UTF-16. (Om du öppnar en textfil och ser exempelvis ”ö” istället för ”ö”, så är det för att UTF-8 lagrar ”ö” med två bytes – som motsvarar två olika tecken i Windows-1252.)

Sortering i alfabetisk ordning underlättar vid teckenkodning

Något som var smart med ASCII och alla teckenkodningar som utökar ASCII, var att bokstävernas koder var i alfabetisk ordning. A var 65, B 66, C 67 och så vidare. Det gör det väldigt enkelt att sortera texter i alfabetisk ordning genom att bara titta på tecknens koder, och ignorera vilket tecken det faktiskt är.

Tyvärr fungerar detta bara för det engelska alfabetet. Både för det svenska och dansknorska alfabetet hamnar Å, Ä, Ö respektive Æ, Ø, Å i fel ordning i teckenkodningarna. Detta märks ibland i datorprogram, att ordningen blir Ä, Å, Ö, eller att Å och Ä sorteras in under A. Anledningen är att samma tecken kan användas på olika sätt i olika språk. Exempelvis är Æ i danska en bokstav i slutet av alfabetet, men i franska sorteras det som AE – i början av alfabetet.

För att hantera detta, behöver man utöver teckenkodning också något som heter kollationering (eng. collation), som ger tecknen en ordning i ett alfabet. Det bör då finnas en kollationeringstabell för varje språk eller alfabet, och man måste utöver teckenkodning också veta på vilket språk texten är skriven.

Slutsats

Hela datorvärlden verkar konvergera mot att använda UTF-8 överallt, så det får anses vara vinnaren av teckenkodningar. Den har stöd för alla tecken i hela världen tack vare Unicode, och är för engelsk text ändå bakåtkompatibel med datorer och program som använder någon ASCII-kompatibel teckenkodning.

Välj UTF-8 när du kan.

Artikelförfattare: Christian Davén, IT-arkitekt på Alfa eCare

Har du frågor om våra system, datasäkerhet eller annat som har med våra tekniska lösningar att göra? Kontakta oss här

Utan teckenkodning kan det bli väldigt fel

När euron skulle införas i slutet av 90-talet behövde man ett nytt tecken för den nya valutan. Efter en designtävling bestämde men sig för tecknet €. Problemet var att detta tecken än så länge inte kunde skrivas på någon dator eller i ett sms någonstans i hela världen eftersom det var påhittat och helt nytt.

I vissa telefoners sms byttes först tecknet ¥ (för de japanska och kinesiska valutorna yen och yuan) ut mot €. Föreställ dig förvirringen när ditt erbjudande eller anbud på ¥1000 en dag har skrivits om av telefonleverantören till €1000! På Windows- och Mac-datorer tog man helt enkelt bort något tecken man bedömde som mindre viktigt och ersatte med €. 

Denna hastiga implementation var inte globalt koordinerad och ibland kunde mottagaren se ditt €-tecken som ¥, ¤ eller ?. Hur kom det sig att detta blev ett problem och hur löstes det?

Kodning av tecken

En teckenkodning är ett sätt att översätta bokstäver, siffror och andra tecken till ”koder”, ”ettor och nollor”, eller numeriska värden. Bokstaven A kodas vanligtvis som 01000001 (65), B som 01000010 (66) och så vidare.

Teckenkodningarnas förfader var Morsealfabetet som översatte bokstäver och siffror till långa och korta signaler (”koder”) som kunde skickas över telegraftrådar eller radiovågor. Morsealfabetet innehöll ursprungligen bara det engelska alfabetet men ganska snabbt skapades internationella och nationella varianter med flera bokstäver. Om avsändaren och mottagaren använder olika alfabet skulle morsealfabetet bli oläsligt. 

På samma sätt fungerar det idag. Om jag skriver en text på min dator eller telefon och skickar den till dig, kommer du bara se samma sak som jag ser om våra enheter använder antingen samma teckenkodning eller lyckas översätta korrekt mellan min och din teckenkodning.

När olika system ska integreras och skickar datafiler mellan sig måste man ha koll på teckenkodningen. Annars riskerar man att istället för Å, Ä, Ö läsa in �, �, �.

Mojibake

Att datorer råkar visa skräptecken istället för det ursprungliga meddelandet är så vanligt att man i Japan har hittat på ett uttryck för det; Mojibake. Det betyder ungefär teckenförändring. Ett exempel är när ”Smörgås” visas som ”SmörgÃ¥s”.

Men varför visas text ibland med en annan teckenkodning än den som användes när man sparade texten? Varför kan inte datorn visa ”rätt”?

Det är så enkelt som att ”man” inte talar om vilken teckenkodning man använder utan bara antar att mottagaren kommer använda samma teckenkodning. På samma sätt antar mottagaren att avsändaren använder samma teckenkodning.

Standarden Unicode

Situationen med hundratals olika teckenkodningar över hela världen, var och en med stöd för 256 tecken och enstaka alfabet, är långt ifrån idealisk. Ett stort steg i rätt riktning är standarden Unicode – som har plats för drygt en miljon tecken! I dagsläget har man dock ”bara” lagt in knappt 150 tusen tecken från alfabet över hela världen, valutasymboler, matematiska tecken, pilar och geometriska former – och emojis.

Varje tecken har i Unicode ett namn och en kod, och tillhör olika kategorier av tecken. Exempelvis har bokstaven Å koden U+00C5 och namnet Latin Capital Letter A with Ring Above. Det är ett fantastiskt ambitiöst arbete som har gjorts.

Ironiskt nog har Unicode i sin tur orsakat förvirring, eftersom det är en standard med många implementationer. Unicode översätter alltså från alla möjliga tecken till koder, men hur dessa koder sedan lagras är en detalj som kan lösas på olika sätt. SMS med Unicode implementerades först med kodningen UCS-2, men på grund av att UCS-2 inte har stöd för emojis, så bytte man till UTF-16. (Ja, emojis är helt vanliga tecken, som standardiseras genom Unicode. Det är inte små bilder, som man skulle kunna tro! Se https://unicode.org/emoji/charts/emoji-list.html)

På webben har UTF-8 helt tagit över, och används nu på 98% av alla webbplatser.

Skillnaden mellan UTF-8 och UTF-16

UTF-8 är bakåtkompatibel med ASCII, en teckenkodning som togs fram på 1960-talet som en digitalisering av Morsealfabetet, och som har blivit alla teckenkodningars stamfader.

Det är snudd på genialiskt att lyckas göra en teckenkodning som både har stöd för hela Unicode och samtidigt är bakåtkompatibel med 7-bitars ASCII. Dessutom är det den Unicode-implementation som kräver minst lagringsutrymme. UTF-16 lagras alltid med två eller fyra bytes för varje tecken. Exempelvis måste man använda två bytes för att representera ett Å och fyra bytes för tecknet Grinning Face (😀).

UTF-8 ”expanderar” smidigt från en till fyra bytes beroende på tecknens kod. Det engelska alfabetet kan lagras med bara en byte per tecken, medan exempelvis Å, Ä och Ö kräver två byte. Grinning Face lagras med fyra bytes, precis som med UTF-16. (Om du öppnar en textfil och ser exempelvis ”ö” istället för ”ö”, så är det för att UTF-8 lagrar ”ö” med två bytes – som motsvarar två olika tecken i Windows-1252.)

Sortering i alfabetisk ordning underlättar vid teckenkodning

Något som var smart med ASCII och alla teckenkodningar som utökar ASCII, var att bokstävernas koder var i alfabetisk ordning. A var 65, B 66, C 67 och så vidare. Det gör det väldigt enkelt att sortera texter i alfabetisk ordning genom att bara titta på tecknens koder, och ignorera vilket tecken det faktiskt är.

Tyvärr fungerar detta bara för det engelska alfabetet. Både för det svenska och dansknorska alfabetet hamnar Å, Ä, Ö respektive Æ, Ø, Å i fel ordning i teckenkodningarna. Detta märks ibland i datorprogram, att ordningen blir Ä, Å, Ö, eller att Å och Ä sorteras in under A. Anledningen är att samma tecken kan användas på olika sätt i olika språk. Exempelvis är Æ i danska en bokstav i slutet av alfabetet, men i franska sorteras det som AE – i början av alfabetet.

För att hantera detta, behöver man utöver teckenkodning också något som heter kollationering (eng. collation), som ger tecknen en ordning i ett alfabet. Det bör då finnas en kollationeringstabell för varje språk eller alfabet, och man måste utöver teckenkodning också veta på vilket språk texten är skriven.

Slutsats

Hela datorvärlden verkar konvergera mot att använda UTF-8 överallt, så det får anses vara vinnaren av teckenkodningar. Den har stöd för alla tecken i hela världen tack vare Unicode, och är för engelsk text ändå bakåtkompatibel med datorer och program som använder någon ASCII-kompatibel teckenkodning.

Välj UTF-8 när du kan.

Artikelförfattare: Christian Davén, IT-arkitekt på Alfa eCare

Har du frågor om våra system, datasäkerhet eller annat som har med våra tekniska lösningar att göra? Kontakta oss här

LÄR DIG MER

Nytt & kunskap

Kika in på sidan Nytt & Kunskap där vi har samlat artiklar och material som vi tror kan vara värdefulla och intressanta för dig.

HÄR FÖR DIG

Kontakt

Har du frågor om våra tjänster och produkter eller behöver du kanske komma i kontakt med någon av oss på Alfa eCare. Under Kontakt hittar du rätt väg fram till oss.

Comments are closed.