Encodage de caractères
J'ai créé il y a fort fort longtemps une base de données MySQL... Et j'ai commis une erreur monumentale (j'étais très ignorant à l'époque, un peu moins maintenant) : choisir l'encodage latin1_swedish_ci
par défaut. Avec mes scripts PHP en iso-je-sais-plus-quoi-sous-windows, c'est devenu une vraie galère dont je ne me suis pas encore sorti : ces scripts sont toujours utilisés, et la base est régulièrement mise à jour...
Aujourd'hui, j'ai eu besoin de faire un outil d'export de certaines données sous Excel, j'utilise donc logiquement PHPExcel qui convient parfaitement... Sauf qu'avec mes données mal encodées, au mieux j'avais des affichages bizarres, au pire je n'avais plus d'affichage. En effet, cette bibliothèque fait un usage intensif de iconv, et cette fonction ne renvoie rien en cas de problème (sans compter que la classe "String" de PHPExcel emploie "@iconv(...)" ce qui "masque" les erreurs)
Bref, après avoir fouillé un peu le manuel de PHP, j'ai trouvé deux outils qui m'ont sauvé la vie temporairement, en attendant de faire un grand grand ménage :
Une fonction de test si la donnée est en utf8
function is_utf8($str) {
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}
J'avoue ne plus me souvenir dans quelle partie du manuel je l'ai trouvée mais un énorme merci à son auteur
Il y a aussi la fonction
mb_convert_encoding($lachaine, $encodage_de_depart, $encodage_d_arrivee)
Ces 2 fonctions m'ont permis d'obtenir un affichage correct... Ouf !