La question peut sembler simpliste à première vue, mais… Elle l’est !

En fait, c’est un problème que l’on peut facilement rencontrer sans vraiment s’en apercevoir et sur lequel il est possible de rester des heures sans trouver de réponse.

Qu’est-ce que UTF-8 avec BOM ou sans ?

UTF-8, pour « UCS transformation format 8 bits », est un format de codage de caractères. L’avantage principal de ce format est qu’il permet de coder des milliers de caractères et donc d’être utilisable dans de nombreuses langues.

L’inconvénient principal est que tous les logiciels ne l’utilisent pas.

Mais comme tous les navigateurs comprennent l’UTF-8, il est de bon goût d’utiliser cet encodage pour vos pages HTML.

Le codage UTF-8 « standard », donc avec BOM (pour « Byte Order Mark ») rajoute un caractère en début de fichier. Un espace insécable de largeur nulle « zero-width no-break space ». Ce caractère est invisible pour l’utilisateur. En fait, ce caractère n’a pas d’intérêt en UTF-8. Il est utile en UTF-16 ou UTF-32.

Le codage sans BOM ne place pas ce caractère, tout simplement.

Quel est le problème alors ?

Étant donné qu’un caractère est ajouté en début de fichier, vous comprendrez peut-être que cela va poser problème pour certain fichiers PHP. En effet, si vous désirez faire une redirection dans le fichier PHP avec « header()« , vous risquez d’avoir une erreur car un contenu aura déjà été envoyé au navigateur avant même que votre redirection commence.

Prenons par exemple le code suivant :

<?php
//————- Test d’encodage
header(« Location: ma-page.php »);
?>

Si vous codez votre fichier en UTF-8, vous aurez une erreur. Si vous le codez en UTF-8 sans BOM, vous n’aurez pas d’erreur.

L’erreur que vous risquez d’obtenir est la suivante :

Warning: Cannot modify header information – headers already sent by (output started at C:\www\monsite\test.php:1) in C:\www\monsite\test.php on line 3

Vous risquez également d’obtenir des décalages dans votre page si vous incluez un fichier codé en UTF-8.

Les solutions

En fait, la première solution consiste tout simplement à coder vos fichiers en UTF-8 sans BOM si votre éditeur de texte préféré le permet. Sinon, changez d’éditeur

L’autre solution, si vous avez accès au php.ini de votre serveur, est de configurer « output_buffering » avec une valeur de 4096 (par exemple). Cela permet de mettre en buffer les pages avant de les envoyer au navigateur. Ce qui permet de corriger le problème de la redirection, mais pas des décalages dans vos pages. En même temps, vous accélérerez un peu la vitesse de création de pages.

Dernière solution, utilisez un autre codage que l’UTF-8. Pas forcément une bonne solution, mais si vous n’avez pas le choix…

Vous voilà prévenu maintenant. Si vous rencontrez un problème de redirection qui ne marche pas ou des décalages dans vos pages (avec des fichier inclus), et que vous n’arrivez vraiment pas à savoir pourquoi, vérifiez le codage de vos fichiers !