PHP: mb_substr à la place de substr pour l’UTF-8

Si vous utilisez un hébergement mutualisé pour quelconque site ou service, lors du développement, tout doit être encodé de la même manière. Comme je le conseil dans l’article concernant les problèmes d’encodage, utiliser UTF-8 avec PHP n’est pas toujours facile, surtout quand c’est PHP lui-même qui vous transforme vos chaines de caractère UTF-8 en ISO-8859-1 (si c’est l’encodage de caractère utilisé sur le serveur…).

C’est en effet le cas de la fonction substr qui converti les chaines de caractères. Comprendre d’où vient l’erreur d’encodage sans penser que ça pourrait être PHP lui-même, c’est dur… Donc, pour spécifier l’encodage à utiliser pour substr, il faut utiliser la fonction mb_substr et lui ajouter un argument comme ceci:

$new_string = mb_substr($string, $start, $end, 'UTF-8');

Que cet article aide de nombreuses personnes à ne pas chercher pendant des heures un problème qui n’est pas réellement de le ressort…

Le problème d’encodage : Des accents en points d’intérrogation

Le problème

Jamais il vous ai arriver pendant la création d’un script (surtout avec des langages dynamiques) d’avoir à la place des accents normaux (é, è, à, ô…) des points d’intérogations :

O? ?aient les p?uches ?

C’est simpa comme texte… Parce qu’en plus, il vous bouffe la lettre d’après – quand il y en a une. Ce cas de figure apparaît quand la page est encodée en ISO-8859-1 mais que dans les entêtes ou dans la balise méta (nous allons voir ça plus bas), il est indiqué que la page est en UTF-8). Mais rassurez-vous, on peut aussi avoir des signes encores plus originaux :

Où étaient les péruches ?

Et ceci dans le cas où la page est encodée en UTF-8 mais que dans les entêtes ou dans la balise méta, il est indiqué que la page est en ISO-8859-1 par exemple. Continue reading