Weergave van speciale tekens in PHP

Als je gebruikmaakt van speciale tekens op je site dan kan het zijn dat dit sinds de introductie van PHP 5.6 niet meer werkt. Dit komt door een wijziging van de waarde van de default_charset variabele in php.ini. Deze was standaard leeg, maar staat sinds PHP 5.6 ingesteld op UTF-8.

Stel je voor dat je de volgende code in je PHP bestanden gebruikt:

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
    <?php echo "éééééeeeeééé"; ?>
  </body>
</html>

Met de standaard instellingen van de oude PHP-versie 5.5 zal de verwachte string gewoon op het scherm geprint worden.

Vanaf PHP 5.6 is de default_charset echter niet meer leeg, maar staat deze ingesteld op UTF-8. Vanuit PHP zelf wordt hierdoor ook een Content-Type response header teruggestuurd. Doordat er een dubbele response header wordt verstuurd zal dit er voor zorgen dat de site niet meer werkt zoals je zou verwachten:

$ GET -uUsSed http://www.example.com/echo.php
GET http://www.example.com/echo.php
User-Agent: lwp-request/2.07
 
GET http://www.example.com/echo.php --> 200 OK
Cache-Control: private
Date: Tue, 31 Mar 2015 12:03:50 GMT
Server: Microsoft-IIS/8.0
Content-Length: 141
Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=ISO-8859-1
Client-Date: Tue, 31 Mar 2015 12:03:50 GMT
Client-Peer: 77.94.251.244:80
Client-Response-Num: 1

De meest simpele oplossing hiervoor is om de HTML meta tag niet meer mee te zenden. De regel
Content-Type: text/html; charset=ISO-8859-1
komt daarmee dus in je code te vervallen.

Een andere manier om dit voor elkaar te krijgen is door de instelling van PHP op dit gebied aan te passen. Dit kan op twee manieren:

  1. Je kunt binnen PHP met een php.user.ini bestand deze instelling overschrijven. Je neemt hiervoor de volgende tekst op in een php.user.ini bestand:
    default_charset = ""
  2. Als tweede alternatief kun je gebruik maken van de ini_set() functie van PHP zelf:
    ini_set(default_charset, "");

Wat vond je van dit antwoord?

Bedankt voor je feedback!

Er is een fout opgetreden. Probeer het later opnieuw.