Je lis de nombreux textes à partir de divers flux RSS et je les insère dans ma base de données.
Bien entendu, il existe plusieurs codages de caractères différents utilisés dans les flux, par exemple UTF-8 et ISO 8859-1.
Malheureusement, il y a parfois des problèmes avec les encodages des textes. Exemple :
-
Le "ß" de "Fußball" devrait ressembler à ça dans ma base de données : "". Si c'est un "", il est affiché correctement.
-
Parfois, le "ß" de "Fußball" ressemble à ça dans ma base de données : "Ã". Dans ce cas, l'affichage est bien sûr erroné.
-
Dans d'autres cas, le "ß" est enregistré comme un "ß" - donc sans aucune modification. Il est alors également affiché de manière erronée.
Que puis-je faire pour éviter les cas 2 et 3 ?
Comment faire pour que tout ait le même encodage, de préférence UTF-8 ? Quand dois-je utiliser utf8_encode()
quand dois-je utiliser utf8_decode()
(l'effet est clair, mais quand dois-je utiliser les fonctions ?) et quand dois-je ne rien faire avec l'entrée ?
Comment faire pour que tout ait le même encodage ? Peut-être avec la fonction mb_detect_encoding()
? Puis-je écrire une fonction pour cela ? Mes problèmes sont donc les suivants :
- Comment puis-je savoir quel est le codage utilisé par le texte ?
- Comment puis-je le convertir en UTF-8 - quel que soit l'ancien encodage ?
Une telle fonction fonctionnerait-elle ?
function correct_encoding($text) {
$current_encoding = mb_detect_encoding($text, 'auto');
$text = iconv($current_encoding, 'UTF-8', $text);
return $text;
}
Je l'ai testé, mais ça ne fonctionne pas. Quel est le problème ?
38 votes
"Le "ß" de "Fußball" devrait ressembler à ça dans ma base de données : "Ÿ".". Non, il devrait ressembler à ß. Assurez-vous que votre collation et votre connexion sont correctement configurées. Sinon, le tri et la recherche ne fonctionneront pas.
5 votes
Votre base de données est mal configurée. Si vous voulez stocker du contenu Unicode, il suffit de la configurer pour cela. Ainsi, au lieu d'essayer de contourner le problème dans votre code PHP, vous devriez d'abord réparer la base de données.
2 votes
USE : $from=mb_detect_encoding($text) ; $text=mb_convert_encoding($text, 'UTF-8',$from) ;