#13084 - Les 50+ commandements du développement PHP - La Ferme du web
(certains conseils valent aussi pour JS ou d’autres langages)
Substr vous fait chier avec les caractères unicode ?
Genre
substr('août', 0, 3)
substr('février', 0, 3)
Vous sortent respectivement ao� et fé ?
C’est parce que les caractères Unicode font 1 octet partout, sauf là ils ne font pas partie des caractères de base (ascii). Le « fé » correspond donc à 1+2 = 3 octets et le « aoû » correspond à 4 octets, où en fait 3 octets correspondent à 2,5 lettres, d’où l’erreur.
Solution : utiliser la version « multi-bytes » (mb_) des fonctions de traitement de texte de PHP. Il faut déclarer un peu plus tôt dans le code :
mb_internal_encoding('UTF-8');
Puis utiliser mb_substr(), qui s’utilise exactement comme substr() :
mb_substr('août', 0, 3)
mb_substr('février', 0, 3)
Vous sortiront respectivement aoû et fév.
Autrement, si mb_encoding n’est pas disponible, vous pouvez toujours transformer le texte en version non accentuée avec ça (le $text doit être converti de UTF8 en ISO avant) :
preg_replace('#&(.)(acute|grave|circ|uml|cedil|tilde|ring|slash|caron);#', '$1', $text)
.
Et le tour est joué plus de problèmes d’encodage :D
function displayChildrenRecursive($xmlObj) {
// si c’est un sous dossier avec d’autres flux à l’intérieur : note le nom du dossier
$folder = $xmlObj->attributes()->text;
foreach($xmlObj->children() as $child) {
if (isset($child['xmlUrl'])) {
echo "\t".'<li><a href="'.htmlentities($child['xmlUrl']).'">'.htmlentities($child['text']).'</a> - ('.$folder.')</li>'."\n";
}
displayChildrenRecursive($child);
}
}
$opmlFile = new SimpleXMLElement($opml_content);
echo '<ul>'."\n";
displayChildrenRecursive($opmlFile->body);
echo '</ul>'."\n";