Contactez-nous

1

Pas de BOM pour PHP (utf-8)

26 avril 2010
par ARNO*

Le problème m’arrive régulièrement lorsque je développe mes propres fonctions dans SPIP, soit dans mes_fonctions.php et mes_options.php, soit dans un plugin :
— certains liens de l’espace privé me mènent à une page qui m’indique un « Type 302 » (login, effacer un message, changer le statut d’un article...) et me demande de cliquer pour poursuivre l’opération (et revenir à l’interface privée « normale »),
— j’obtiens un message d’erreur PHP de genre « Headers already sent »,
— je vois apparaître dans mes pages publiques des caractères bizarres, généralement la série « ï»¿ ».

Ces trois problèmes viennent généralement de la même source : un fichier PHP ou un squelette encodé en unicode (utf-8) démarrant par l’insertion d’une indication de « BOM » : « Marque d’ordre des octets ».

Ce marqueur est un caractère inséré en début de fichier unicode, automatiquement : il est utile en utf-16 et utf-32, mais pas indispensable en utf-8 (qui est le format d’encodage des caractères que l’on utilise désormais de plus en plus sur le Web - et que j’utilise désormais sytématiquement pour ne plus avoir à coder les caractères sous formes d’entités HTML du genre é).

C’est ce caractère qui est inséré en tout début de fichier provoque les erreurs :
— dans un squelette, il peut devenir un caractère « visible », et sur un site qui n’est pas lui-même en utf-8, on voit apparaître la série  (qui est sa translittération en iso-8859-1),
— dans un fichier PHP, cela provoque l’envoi de caractères avant le démarrage du PHP, avec notamment l’interdiction d’envoyer des entêtes PHP par la suite ; dans notre cas : les entêtes qui provoquent une redirection vers une autre page.

La solution est simple :
— ouvrir le ou les fichiers fautifs avec l’éditeur et forcer la sauvegarde dans le format « UTF-8 NO BOM » ; c’est la meilleure solution ; le fichier est ainsi sauvegardé correctement en Unicode utf-8, mais sans ce caractère ; en général, il suffit de traiter mes_fonctions.php et mes_options.php pour corriger tous les dysfonctionnements ;
— si vous ne pouvez pas sauvegarde en UTF-8 NO BOM, sauvegarder le fichier en ISO-8859-1, mais en prenant soin de transformer d’abord les caractères accentués en entités HTML. Ça n’est pas la solution idéale, surtout si comme moi on fait des fonctions PHP testant des chaînes multi-bytes. Mais pour beaucoup de sites, c’est souvent très suffisant. (Mais idéalement, adoptez un éditeur de texte qui vous permet de sélectionner la sauvegarde au format UTF-8 NO BOM.)

  • Seb
    Octobre 2011

    Je précède toujours mes variable avec des "$" comme suffixe par soucis de visibilité, Par contre je n’ai pas le choix d’utiliser le UTF-8 pour éviter les erreur de syntaxe.

    Seb Albi Mazda

Qui êtes-vous ?
Votre message

Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.