Magazine Internet

L'encodage UTF-8 avec BOM fait apparaitre un  en haut de page

Publié le 30 avril 2009 par Avi Teboul

L'encodage UTF-8 avec BOM fait apparaitre un  en haut de page

Voila 3 jours de recherches intensives pour résoudre un problème pourtant simple, l'encodage des fichiers. Comme vous le savez il existe différents types d'encodage pour le web, les plus répandus et utilisés sont l'ISO-8859-1 et L'UTF-8.

Mais voilà, autant l'ISO-8859-1 peut entrainer des erreurs d'affichage des accents, autant l'UTF peut (en plus de n'avoir pas affiché les caractères spéciaux désirés) en ajouter en début de fichiers, ce qui devient un calvaire si vous faites plus d'inclusion de fichiers. Une explication s'impose.

Encodage en ISO-8859-1

L'ISO-8859-1 : si vous utilisez cet encodage il y a fort à parier que vos accents, cédilles, et autres circonflexes ne s'affichent pas et laissent place à des choses bizarres. Pas de panique. Il faut déjà comme pour tout encodage vérifier la cohérence entre l'encodage du fichier, l'encodage déclaré par votre doctype et l'encodage éventuellement envoyé via php (pour forcer l'encodage).

Pour le doctype il suffit de faire :

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Pour le php :

Ajouter en début de fichier :

header('Content-Type: text/html; charset=iso-8859-1');
ini_set('default_charset', 'iso-8859-1');

Quant au fichier lui-même, utilisez Notepad++ pour convertir ou vérifier l'encodage. Pour cela allez dans le menu "format" et sélectionnez : "Convert to ANSI".

Voilà, c'est pas plus compliqué que ça, et si vos caractères spéciaux s'affichent toujours mal, utilisez les valeurs de correspondance tels que &eacute;  pour afficher un é.

Encodage en UTF-8 : avec ou sans BOM ?

Le BOM ( byte order mark) traduisez "ordre d'affichage des octets", permet de spécifier l'ordre d'affichage des octets dans une fichier encodé en UTF-8 avec le BOM, ce qui peut se traduire par l'affichage du caractère :   en début du fichier... Oui je sais c'est pas cool, surtout si vos fichiers sont inclus les uns dans les autres, ça peut provoquer un décalage d'affichage de vos balises monstreux !
Pas de panique !
Le BOM est là pour aider votre fichier (en théorie) : d'après ce que j'ai lu il règle des conflits entre les types de fichiers Windows et Unix (mais je n'en suis pas sûr du tout !)
Quoi qu'il en soit il va falloir s'en séparer...
On commence par reprendre les mêmes manip que pour l'iso, c'est à dire que l'on va homogénéiser l'encodage :
Pour le doctype il suffit de faire :

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Pour le php :

Ajouter en début de fichier :

header('Content-Type: text/html; charset=utf-8');
ini_set('default_charset', 'utf-8');

Il ne reste plus qu'a convertir votre fichier avec Notepad ++ en UTF8 SANS BOM ! Et c'est cette simple manipulation qui fera toute la différence.
Si toutefois les caractères persistent voici un script (désolé pour l'auteur je ne retrouve plus la source) qui va vous permettre de les détecter, il suffit de créer un fichier par exemple : bom.php et le placer à la racine puis afficher ce fichier ( http://monsite.com/bom.php) la liste des fichiers infectés (oui on peut parler d'infection grrr), s'affichera :
<?php
$extensions_allowed = array();
$extensions_allowed [] = 'php';
$extensions_allowed [] = 'html';
$extensions_allowed [] = 'ini';
$extensions_allowed [] = 'tpl';
function listeFichiers($dir){
  global $extensions_allowed;
  if ($handle = opendir($dir)) {
   /* Ceci est la façon correcte de traverser un dossier. */
   while (false !== ($file = readdir($handle))) {
   if (($file <>'.') & ($file<>'..')) {
   if (is_file($dir.'/'.$file)){
   $extension = pathinfo($dir.'/'.$file, PATHINFO_EXTENSION);
   if (in_array($extension,$extensions_allowed)){
   $fileHandle = fopen($dir.'/'.$file, "r");
   $intro = fread($fileHandle, 3);
   fclose($fileHandle);
   if ($intro == "\xEF\xBB\xBF"){
   echo "$dir/$file\n";
   flush();
   }
   }
   } else {
   if (is_dir($dir.'/'.$file)){
   listeFichiers($dir.'/'.$file);
   }
   }
   }
   }
   closedir($handle);
  }
}
header("Content-type: text/plain\n\n");
set_time_limit(3600);
$path = $_SERVER['DOCUMENT_ROOT'];
if (substr($path,-1)=='/'){
  $path =  substr($path,0,-1);
}
listeFichiers($path);
?>

L'encodage UTF-8 avec BOM fait apparaitre un  en haut de page


Les dernieres videos de buzz

Voir les dernieres videos

Retour à La Une de Logo Paperblog

A propos de l’auteur


Avi Teboul 600 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte