jeudi 4 avril 2013

UTF8, BOM, PHP, un mélange indigeste pour les fichiers à télécharger.

En PHP, il est recommandé d'écrire vos scripts en UTF8 sans BOM. Jusqu'à présent, je n'avais jamais prêté attention à cette recommandation. Pour ceux qui douteraient du bon sens de ce conseil, voici un exemple illustrant l'usage malencontreux de ce fameux tiercé de caractères, parfois placés en début de fichier UTF8.


Voici l'exemple PHP en question, et qui permet le téléchargement d'un fichier XML :


header("Content-Type: text/xml"); 
....
$buffer =file_get_contents('fichier.xml');
echo ($buffer);
exit();

Le but est de pouvoir télécharger coté client un fichier 'fichier.xml', sans en modifier un seul octet. Et pourtant, le fichier téléchargé se trouvait (coté client) augmenté de trois caractères parasites, le tristement fameux BOM. Mais pourquoi donc la fonction echo(), ou la fonction file_get_contents() ajouterait ce BOM parasite. J'ai perdu une bonne heure à éplucher la documentation de ces deux fonctions sans succès. Pour finir, j'ai vérifier le format du script PHP lui-même. Merci d'ailleurs à Notepad++ qui permet en un simple click, de connaitre et de changer le format de ses fichiers: 

Le problème fut résolue en supprimant le BOM. Il semble donc que le moteur PHP interprète ces trois caractères, présents au début du fichier PHP, comme des caractères à afficher. Ces trois caractères se retrouvent ainsi et involontairement dans le flux binaire du fichier à télécharger.

Le BOM (Byte Order Mark) est l'une des plus mauvaises idées imaginées pour résoudre la problématique des multiples charsets. Bonne continuation @vous dans le monde merveilleux de l'encodage des caractères.

  

Aucun commentaire: