Tekenset en -codering

Posted on

Verrassend vaak nog krijg ik (zelfs van IT professionals) de vraag waarom hun website van de ene dag op de andere plots “vreemde” tekentjes vertoont op plaatsen waar je een é of een ç of aan µ verwacht. Het gebruik van karaktersets is namelijk even eenvoudig als belangrijk …

Welke karakters een browser op ons scherm plaatst wordt bepaald door de tekenset en tekencodering. De tekenset is de verzameling van beschikbare karakters.  Ons alfabet zou als een tekenset van 26 tekens beschouwd kunnen worden.  UNICODE is een voorbeeld van een zeer veel gebruikte tekenset in de IT wereld, deze set probeert alle karakters te verzamelen die nodig zijn om quasi elke taal compleet te kunnen weergeven. Tekencodering is dan weer de manier om een karakter op te slaan in de vorm van bytes.  UTF-8 is een veel gebruikte vorm van tekencodering.

In praktijk worden de termen tekenset en tekencodering door elkaar gebruikt. Zo zal je vaak lezen dat een tekst is opgebouwd met de UTF-8 tekenset, … niet 100% correct maar iedereen begrijpt wat er bedoeld wordt.

Als onze webpagina gecodeerd is op basis van tekstcodering A en de browser probeert ze te decoderen op basis van tekstcodering B dan krijgen we de gekke tekens op het scherm. Het komt er dus op aan tekstcodering A te gebruiken en de browser duidelijk te maken dat we A gebruiken en niets anders. Elke deftige teksteditor voorziet in de mogelijkheid om de codering te bepalen, zelfs Kladblok van Windows. Zorg er dus voor dat je goed weet welke tekstcodering je gebruikt. (UTF-8 is absoluut aan te bevelen !!).

image

1. De webserver kan deze informatie meegeven in de vorm van een “Content-Type” HTTP header. Zo’n header instellen kan in de config bestanden van de meeste webservers (vb .htaccess in een apache webserver)

AddCharset UTF-8 .html

of kan door een scripting taal voorzien worden (vb. PHP).

<?php
header('Content-Type: text/plain; charset=UTF-8');
?>

2. De HTML pagina  kan deze informatie meegeven in de vorm van een “META” – tag

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

De eerste manier geniet de voorkeur maar is niet altijd haalbaar, daarom is de tweede manier een absolute must have in elk HTML document.  Als de tekstcodering niet opgegeven wordt moet de browser raden welke tekstcodering hij moet gebruiken. Afhankelijk van browser tot browser en van webpagina tot webpagina lukt dat soms wel, soms niet.

Bij statische pagina’s zijn de problemen onmiddellijk duidelijk en mits wat trial en error kan elk aapje het in orde krijgen.  Dynamische webpagina’s die tekst ophalen uit een databank staan echter voor heel wat meer problemen.

Wanneer je tekst in de databank wil invoeren moet er tussen je programmeertaal en de databank afgesproken worden welke taal je spreekt tijdens de communicatie, de databank moet de data opslaan op basis van een karakterset die alle karakters bevat die jij wil gebruiken en tot slot … als je data ophaalt uit de databank moet je die krijgen in het formaat van je HTML pagina.  Immers als je bovenaan je pagina aangeeft dat je HTML pagina in “UTF-8”  gecodeerd is moet je databank er niet zomaar wat ISO 8859-1 komen tussen gooien.

Tekst aanbieden aan je databank doe je vaak nadat iemand een HTML formulier gepost heeft naar een pagina. Je gaat de $_POST[‘xxxx’] al dan niet na bewerking in de databank opslaan.  De $_POST[] variabelen gebruiken de tekstcodering van de HTML/PHP pagina.   Verwittig je databank dat je UTF-8 tekst gaat aanleveren :

mysql_set_charset(‘utf8’);

Voor elk veldje in elke tabel van elke databank van elke MySQL server kan je bepalen hoe tekst wordt opgeslagen (= met welke codering). Kies een karakterset die alle karakters bevat die je wil opslaan in je databank, bij voorkeur dezelfde tekenset als die die je in je HTML/PHP pagina gebruikt en die die je gebruikt om te communiceren met de databank.  Je kan de tekencodering (de Collation) bepalen op 4 niveau’s. Het laagste niveau heeft prioriteit. Als je dus je tabel collation instelt op “Latin-1” maar je veld op “UTF-8” dan zal de tekst in dat veld met UTF-8 gecodeerd worden.  Stel je geen specifieke collation in voor een veld dan wordt de tabel collation genomen. Is er geen specifieke tabel collation ingesteld dan wordt de databank collation genomen enz …

Tot slot … als je een HTML/PHP Pagina hebt die in UTF-8 gecodeerd is dan wil je dat de tekst uit de databank ook in UTF-8 aangeleverd wordt.  Dat doe je ook met

mysql_set_charset(‘utf8’);

Dat problemen soms pas “op termijn” boven water komen is normaal. De meeste vormen van tekstcodering gebruiken dezelfde codering voor veel voorkomende karakters als a-z, A-Z, 0-9, enz … De codering wordt pas afwijkend op het ogenblik dat je karakters gebruikt als è, à, é, µ, ~, ..

Samenvattend : consequent één vorm van tekst codering gebruiken voor zowel de opmaak van de HTML/PHP pagina, communicatie met de databank als opslag in de databank combineren met deze tekstcodering duidelijk definiëren op alle niveau’s is de enige garantie op een website zonder gekke tekentjes !

Toch nog problemen met tekenset en tekencodering? Contacteer ons !