Bref, parce que ça a déjà été discuté mille fois :
- PHP contient une chaîne, dites
"漢字"
, codé en UTF-8. Les octets pour cela sontE6 BC A2 E5 AD 97
. - Il envoie cette chaîne via une connexion de base de données définie sur
latin1
. - La base de données reçoit les octets
E6 BC A2 E5 AD 97
, pensant que ceux-ci représententlatin1
caractères. - La base de données stocke les caractères
æ¼¢å
(les caractères quiE6 BC A2 E5 AD 97
correspond à enlatin1
). - Le même processus inversé fait que PHP reçoit les mêmes octets, qu'il traite ensuite comme UTF-8. L'aller-retour fonctionne bien pour PHP, même si la base de données ne traite pas les caractères comme il se doit.
Le problème ici était donc que la connexion à la base de données n'était pas correctement définie lorsque les données ont été entrées dans la base de données. Vous devrez convertir les données de la base de données en caractères corrects. Essayez ceci :
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Peut-être utf8
n'est pas ce dont vous avez besoin ici, expérimentez. Si cela fonctionne, changez ceci en un UPDATE
déclaration pour mettre à jour les données de façon permanente.