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)
Een onhandige fix is om encoding te vermijden via HTML:
Een snelle fix:
Structurele oplossing:
Code (php)
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:
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:
Dit is de verkorte versie van:
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)
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.
« vorige pagina | volgende pagina »
Inhoudsopgave
- Inleiding
- Over Unicode
- PHP en UTF-8
- Tekstbestanden
- Databases
- Overige in- en uitvoer
- Verwerking in PHP
- Conclusie