Karakter Sets en Encoding

Het is mogelijk dat niet alle tekens op deze pagina goed weergegeven worden. Op deze pagina komen een aantal ‘buitenlandse’ tekens voor die niet noodzakelijkerwijs op alle computers geinstalleerd zijn

Charecter sets and Encodings

In Den Beginne was er ASCII en men zag dacht dat het goed was.

ASCII is een 7 bit systeem om te definiëren welke letters op het scherm moet plaatsen. Uiteindelijk kan een computer namelijk niks met letters, een computer kent maar twee tekens een nul en een, die desnoods wel samengevoegd kunnen worden tot een getal in de vorm van een byte (acht nullen of enen).

De ASCII tabel definieert bij welk getal welk karakter hoort. Een stukje ascii tabel ziet er zo uit.

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Dus stel ik wil graag dat de computer een ‘A’ moet weergeven, dan vertel ik hem dat hij ASSCII karakter 65 moet weergeven.

Dus een ‘tekst’ die er voor de computer zo uitziet:

87 69 66 83 73 84 69

Wordt door de computer volgends de ASCII – codering vertaald naar: WEBSITE

Echter we kunnen ook iets heel anders afspreken:

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
т у ф х ц ч ш щ ъ ы ь э ю я ѐ ё ђ ѓ є ѕ і ї ј љ њ ћ

en 87 69 66 83 73 84 69 wordt dan:

ј ц у є ъ ѕ ц

Best grappig allemaal maar wat is het probleem.

Het probleem is dat 7-bits ascii maar ruimte heeft voor 128 karakters, nu is dat voor de gewone westers letters,cijfers en leestekens genoeg, maar zodra is iets anders wilt weergeven zoals à en é wordt het krap. Nu kun je er een bitje bijplakken en overgaan op 8 bits ( is 256 karakters) maar ook dan nog zal het niet lukken hierin voor alle talen de karakter te stoppen, denk maar aan het chinees dat uit duizenden karakters bestaat.

De oplossing die hiervoor bedacht is het UNICODE, unicode is een karakterset waar elk karakter wordt weergegeven als 16 bits (2 bytes), hetgeen 65536 mogelijk karakter definites mogelijk maakt. Een slordige 50.000+ plus van deze karakters zijn reeds gedefinieerd. Naast het gewone westerse alfabet met en zonder accenten en trema’s komen hierin ook onder andere cyrillische karakters in voor, Hebreeuws, Thais en tien duizenden Aziatische tekens.

Nadeel van het gebruik van UNICODE is dat alle documenten ruim twee keer zo groot worden, immers ipv van de 7/8 bits van ASCII hebben we 16 bits nodig, de tabel is een factor 256 groter geworden. En hoewel computers en internet steeds sneller worden is het nog steeds verstandig zuinig met ruimte om te gaan, er zijn nog genoeg gevallen waar omvang wel een probleem kan zijn, denk aan PDA’s en telefoons. Daarnaast kunnen de meeste tekst verwerkers helemaal niet overweg met 16 bits karakters. In het algemeen heb je de complete set van 65000+ karakters helemaal niet nodig maar een subset. Als je er dan voor zorgt dat een subset maximaal 256 karakters bevat past het weer in een byte.

Stel we willen een document schrijven in het Russisch, hiervoor hebben we het Cyrillische alfabet nodig. In unicode zit het Cyrillisch op de plekken 1024 tot 1273, dit zijn maar 249 karakters dus dat past in een byte. Als we van de positie steeds 1024 aftrekken hebben we weer een subset van 0 tot 255. Anders om als we de computer vragen om karakter 182 weer te geven, moet deze er eerst 1024 bij optellen om unicode 1046 weer te geven (Ж).

Deze subsets heten ‘Character encodings’ Cyrillisch is gedefinieerd als ISO-8859-5, als een document de set ISO-8859-5 gebruikt zal de tekstverwerker 1024 optellen bij alle karakter waardes in het document om zo op de goede plek in de tabel uit te komen.

Internatinalisation I18N

Dit hele verhaal staat ook wel bekend als Internatinalisation afgekort als I18n. Het ‘toevoegen’ van i18n aan een website, een webste i18n geschikt maken wil zoveel zeggen als ervoor zorgen dat een website met internationale characters overweg kan vaak door gebruik te maken van UTF-8 codering

Als je nu het document de verkeerde encoding meegeeft zal de tekst niet goed weergegeven worden. Zowel met Internet-explorer als Firefox is het mogelijk de encoding handmatig in te stellen, dit zit onder ‘View’ -> ‘(Character) Encoding’. Voor de westerse karakters zijn er een aantal verschillende encodings, de gebruikelijke is ISO-8859-1. En gelukkig zijn de meeste westerse encodings min of meer uitwisselbaar voor wat de gewone letters en cijfers betreft, zodat een verkeerde keuze niet onmiddellijk een onleesbaar resultaat oplevert. Wissel maar eens naar Chinees, vrijwel alle niet standaard karakters veranderen in Chinese tekens om vraagtekens. Als je van ISO-8859-1 overgaat op UTF-8 zie je dat alle karakters die niet in de eerste 128 posities voorkomen de mist in gaan, UTF-8 verwacht voor deze karakters tenslotte een andere ( 2 byte) codering. Met UTF-16 wordt het helemaal een zooi. Op zich lijkt dit een weinig zinvolle oefening, de encoding handmatig foutief zetten, maar het laat zien wat er gebeurt als de encoding de gebruikt wordt niet overheen komt met de codering van het document.

Een notoir geval is het euroteken. Dit teken kwam er pas ruim na de invoering van de ASCII tabellen ( 7 en 8 bits ) gekomen. En er was eigenlijk niet echt plek meer voor. Maar omdat het toch we handig zou zijn om het euro teken beschikbaar te hebben is deze er tussen gepropt. Net als bij de toetsenborden, bij veel zit het euroteken onder de 5 geplakt en met een beetje mazel kun je het teken krijgen met ALT-GR + 5. Met het euroteken op je webpagina is het net zo, afhankelijk van het gebruikte programma, je systeem, kleur van je haar, maanstand, vind er een verschillende codering plaats. En is er een goede kans dat een bezoeker iets anders ziet dan de bedoeling was. Meestal een ‘?’. Dus in plaatst van Aanbieding slechts €15,- staat er ?15,-. Een veilige manier om een euro teken weer te geven is met € (Zie ook HTML Speciaal) dat geeft: . Of ervoor zorgen dat het charset goed staat: ISO-8859-1 is de meest voor de hand liggende keuze voor westerse talen.

Je kunt de encoding stoppen in de <head> sectie van je document:
<meta http-equiv='content-type' content='text/html; charset=ISO-8859-1'>

Of het charset meesturen in de html-headers (Bij dynamische pagina’s gemaakt met bijvoorbeeld asp of php):
Content-type: text/html; charset=ISO-8859-1;

En ander probleem geval zit hem in de smart-quotes van bijvoorbeeld MS-word. Bij het knippen en plakken gaat met name de omzetting van de afsluitquote () niet goed. Weliswaar wordt het karakter meestal wel goed weergegeven, het is (vaak) geen geldige ASCII maar wordt het als iets binairs opgeslagen en zodoende is het resultaat geen geldige html. Om de fun nog groter te maken is de weergave van deze smart-quotes ook nog eens afhankelijk van het gekozen lettertype in een scheefloos type (sans-serif zoals verdena) zit het er anders uit: ‘ ’ / ‘ ‘ dan in een lettertype met schreef ‘ ’

UTF-8 8-bit Unicode Transformation Format

Terwijl de ISO encodings een soort schuivend venster over de unicode leggen zijn er ook encodings die andere methoden gebruiken. Een steeds meer gebruikte is UTF-8 aangezien deze voor XML ‘verplicht’ is. In tegenstelling tot wat de naam suggereert is UTF-8 niet 8 bits, maar 8,16,24 of 32 bits.

De eerste 128 karakters worden in 1 byte weergegeven, karakters die verder in de tabel voorkomen door 2,3 of 4 bytes. Dit betekend dat UTF-8 voor tekst waar weinig ‘hoge’-karakters in voorkomen efficiënter is dan UTF-16 welke altijd uit 2 bytes bestaat. Echter veel oosterse karakters gebruiken 3 bytes in UTF-8 terwijl ze slechts 2 bytes zouden gebruiken in UTF-16. Hierdoor wordt tekst in deze talen groter dan noodzakelijk en is het efficiënter om UTF-16 te gebruiken

HTML entities

Alle unicode karakter kunnen eenvoudig worden weergegeven door gebruik te maken van html-entities. Het eerder gebruikte Cyrillische teken 1046 kun je weergeven met &#1046; Ж dit is onafhankelijk van de codering van het document. Echter niet bijzonder leesbaar of efficiënt tenslotte gebruik je 7 bytes waar je met 1 (ISO-8859-5) of 2 ( UTF-8/16) kunt volstaan.

Bij een (online) CMS systeem is het van belang bij het knippen en plakken van teksten uit andere bronnen goed te controleren of de codering nog klopt. Dit CMS systeem vertaalt karakters uit de UTF-16 set keurig naar de bijbehorend html-entity wordt &#3585;. De vertaling van smart-quotes gaat echter niet goed, iets om in de gaten te houden.

Encodings

Onderstaan wat encoding, behalve de eerste zijn ze allemaal als html-entities opgezet. Als je de encoding van de pagina aanpast zou alleen de eerste tabel moeten veranderen afhankelijk van de gekozen codering. Probeer eens wat Oosters.

ISO-8859-1

¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
° ± ² ³ ´ µ · ¸ ¹ º » ¼ ½ ¾ ¿
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
à á â ã ä å æ ç è é ê ë ì í î ï
ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

ISO-8859-5 – Cyrillisch

Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ ­ Ў Џ
А Б В Г Д Е Ж З И Й К Л М Н О П
Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
а б в г д е ж з и й к л м н о п
р с т у ф х ц ч ш щ ъ ы ь э ю я
ё ђ ѓ є ѕ і ї ј љ њ ћ ќ § ў џ

ISO-8859-11 – Thai

฿

GBK – Chinees

Aangezien Chinees wat meer ‘leestekens’ heeft dan de 256 die in een byte passen is ook dit een multi-byte codering als UTF-8

鵿