top pagina

<< home <<


(Eigen)aardigheden Internet

logo

 << internet home <<

 UTF-8 en Unicode

door Harry Koopman

20 juli 2006


This text is also available in ENGLISH, click here

UTF-8 en Unicode

Enkele antwoorden op een aantal onverwachte problemen rond het gebruik van UTF-8 als tekenset (charset) in xhtml documenten.

Voor doodgewone html pagina's volstaat de tekenset codering:
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1">
nog wel, maar wil je meer, bijvoorbeeld voorgebakken teksten includen, of cms-oplossingen is utf-8 als charset een betere oplossing.
Hier enkele problemen die ik tegenkwam. De eerste is nog wel het merkwaardigst.

utf-8 doorstaat ftp-programma niet

Werk je met Fetch als ftp-programma? Let dan op. In Fetch versie 4.03 Moet 'Translate ISO Characters' uitgevinkt staan! Deze staat standaard aangevinkt. Je vindt dit in de preferences onder Miscelanious.
Doe je dat niet, worden alle UTF-8 documenten die je naar de server stuurt verminkt. De moraal van dit verhaal, gebruik een modern ftp-programma en controleer de instellingen ervan.

Zorg dat je (x)html maar ook je te includen teksten utf-8 gecodeerd zijn

want dit is niet automatisch het geval. Bijvoorbeeld in BBEdit 7, de tekst bewaren met 'Save As', en dan bij de opties UTF-8 kiezen.

UTF-8 with Byte Order Mark ?

Je kunt de UTF-8 dan met of zonder BOM wegschrijven. Als je met PHP werkt, schrijf de UTF-8 zonder Byte Order Mark, omdat er problemen kunnen optreden met PHP. Die BOM wordt namelijk aan het begin van de file gezet. Met sommige dingen kan PHP daar niet tegen, bijvoorbeeld bij een commando als dit:
<?php
header("Content-Type:text/html;charset=utf-8");
?>
Omdat je dit commando uitsluitend als allereerste in de (x)html doc kan geven, zal de PHP-parser door de BOM-bytes dit niet meer goed doen en een error geven.

Welke encoding stuurt je server?

Ik ga er nu even vanuit dat je een externe server cq hosting bedrijf hebt.
De Apache server geeft default in de http-header een encoding mee.
http://www.rexswain.com/httpview.html
Via bovenstaande url kun je de http-header van een document bekijken. Daarin staat de Content-Type gedefinieerd.
Is deze:
Content-Type:·text/html
dan is het ok. Je kunt namelijk zelf in je (x)html document met
<meta http-equiv="content-type" content="text/html;charset=utf-8">
deze nader definieren.
Staat er echter in de http-header:
Content-Type:·text/html;·charset=iso-8859-1
Dan doet Apache zijn huiswerk te goed. Want doordat Apache (middels een instelling in de httpd.conf) de charset in de http-header definieert kun je die zelf met bovengenoemde meta tag niet overriden in je html-code zelf. Dit komt nogal vaak voor omdat het de default-instelling van Apache is.

charset met htaccess wijzigen

Een mogelijke optie is dan via een .htaccess bestand met de volgende inhoud ...

AddCharset UTF-8 .html
AddType "text/html; charset=UTF-8" html

... de charset te overrulen. Bovenstaande werkte voor mij; het kan zijn dat je kan volstaan met alleen AddCharset of alleen AddType.
Je kunt e.e.a. weer controleren door naar de Content-type in de http-header te kijken.

charset met htaccess ongedaan maken

Een andere oplossing is om in de root van de website een .htaccess te plaatsen met de inhoud:

AddDefaultCharset Off

Deze elimineert de charset definitie door Apache voor de hele website, en in de gehele website kunt u dan de eerder genoemde meta tag gebruiken om uw karakterset per pagina in te stellen. Dus in de <head> sectie van uw (x)html:

<meta http-equiv="content-type" content="text/html;charset=utf-8">

indien u op de pagina een utf-8 codering wenst.

htaccess problemen

Die kunnen er zijn, want het is mogelijk dat een .htaccess helemaal geen effect heeft, of dat een htaccess een internal server error (error 500) geeft. Dit hangt af van instellingen op system-operator niveau in de httpd.conf file.

Heb je een door de Apache server standaard gestuurde iso-8859-1 Content-type, én daarbij geen mogelijkheid met .htaccess de content-type te wijzigen, heb je een probleem. Want dan is utf-8 niet mogelijk (behalve met php, zie verder). Dan moet je je server-administrator even een mailtje sturen.

header sturen met php

Door in een php document als allereerste
<?php
header("Content-Type:text/html;charset=utf-8");
?>
in te geven kun je ook de utf-8 encoding forceren voor het document. Maar let op die eerder genoemde Byte Order Mark, die de zaak in de war kan gooien.

20 juli 2006, Harry Koopman (update 13 december 2008)

top

logo
www.marsandmc.nl | harry koopman
rechten voor overname voorbehouden