Tekstbestanden

PHP-programmabestanden
PHP-bestanden moeten ASCII-compatible worden opgeslagen. En ASCII is een subset van UTF-8.
Dus .php-bestanden kunnen veilig als UTF-8 (zonder BOM) worden opgeslagen.
Daarmee worden alle hardcoded strings en array-waarden ook automatisch UTF-8.

Wat gaat er wel eens fout:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$hi
= 'Hallo cliënt!'; // Latin1 string
header('Content-type: text/plain; charset=utf-8'); // Browser: nu volgt UTF-8
print $hi; // Browser interpreteert Latin1 string als UTF-8, gaat fout
?>


Een onhandige fix is om encoding te vermijden via HTML:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
print htmlentities($hi); // karakter wordt omgezet naar langere HTML-entiteit
?>


Een snelle fix:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
print utf8_encode($hi); // karakter wordt eerst getranscodeerd naar UTF-8
?>


Structurele oplossing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$hi
= 'Hallo cliënt!'; // UTF-8 string, want .php is opgeslagen als UTF-8 zonder BOM
header('Content-type: text/plain; charset=utf-8'); // Browser: nu volgt UTF-8
print $hi; // Browser interpreteert UTF-8 string als UTF-8, geen probleem
?>


Hardcoded strings zijn op deze manier eenvoudig aan te passen door de .php-bestanden op te slaan als UTF-8. Merk op dat dit ook van invloed is op alle strings, dus ook SQL queries die in PHP zijn opgeslagen.

HTML-bestanden
HTML 5 hanteert standaard UTF-8 encoding, en ook JavaScript is Unicode (UTF-16). Er zijn drie plaatsen waar je aan de browser de encoding van de HTML door kunt geven: In de HTTP-header, in de XML-header bij XHTML, en als een metatag.

De laatste jaren wordt zoveel mogelijk in HTML5 gedaan. Hoewel die standaard nog niet definitief is hebben de meeste browsers de functionaliteit al wel geïmplementeerd. HTML5 is SGML en helaas niet compatible met XML, polyglot HTML kunnen we vergeten en de bekende XML-header valt af:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>


De charset-metatag is vooral handig bij een opgeslagen HTML5-bestand wanneer er geen andere indicatie is van de encoding.
In de /body/head node van een HTML5 document ziet het er vaak zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<meta charset="utf-8" />

Dit is de verkorte versie van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Wat hier te lezen valt is dat 'http-equiv' staat voor HTTP-equivalent, ofwel gelijkwaardig aan de HTTP-header. Dat is verwarrend als de HTTP-header zelf op een andere encoding is geconfigureerd, bijvoorbeeld wanneer een webserver autistisch is afgesteld om alles met Latin1 in de HTTP-header te serveren. Dan weet de browser in feite niet welke van de twee opgegeven encodings de juiste is.

Het beste is om alle encodings met de HTTP-header op te geven, althans voor alle HTML5 wat via de webserver aan de browser wordt aangeboden. Dan is er een single version of the truth en je geeft niet iets aan met HTML dat eigenlijk via de HTTP-header hoort te gaan, als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('Content-Type: text/html; charset=utf-8'); /** @link http://www.w3.org/International/O-HTTP-charset */
readfile($sHTML5bestand);
?>


Databestanden
Bijvoorbeeld lezen of schrijven van databestanden van of naar CSV. Ook hier is encoding cruciaal.
Maak je gebruik van binaire functies als fopen() of fgetcsv() dan moet je alles zelf transcoden waar nodig.
Dat kan alleen als je weet welke bron- en doelencoding de bestanden hebben, het verschilt per versie van software en ook per platform.
Het moet duidelijk zijn uit de bijbehorende documentatie.

« Lees de omschrijving en reacties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.