La fixation cassées encodage UTF-8
Je suis dans le processus de la correction de certains mauvais encodage UTF-8. Je suis actuellement en utilisant PHP 5 et MySQL.
Dans ma base de données j'ai un peu de cas de mauvais encodages d'impression comme: î
- Le classement de base de données est utf8_general_ci
- PHP à l'aide d'un bon UTF-8, en-tête
- Notepad++ est configuré pour utiliser UTF-8 sans BOM
- gestion de base de données est gérée dans phpMyAdmin
- pas le cas de tous les caractères accentués sont cassés
J'ai besoin d'une sorte de fonction qui va m'aider à cartographier les instances de l'î, ÃÂ, ü et d'autres comme lui à leur bon accentué les caractères UTF-8.
- Pourriez-vous lister les caractères de ceux qui sont censés représenter? Et peut-être un vidage hexadécimal?
- Un rapide coup d'oeil semble suggérer que vos chaînes pourraient avoir été "double" codé en utf-8. I. e. encodé en utf-8, ces octets pris comme des caractères unicode, et le résultat codé en utf-8. Retour en arrière: "î"="\xC3\x83\xC2\xAE" <-(utf-8)- "\xC3\xAE" <-(utf-8)- "\xEE" = "î". Ou peut-être pas -- pas beaucoup de données afin de diagnostiquer ici.
- Il est possible que c'était un double codage. Est-il un moyen sûr d'en programmant le vérifier, et si oui, quelle est la meilleure façon sécuritaire à décoder le double encodage?
- Oui, Jayrox, découvrez ma réponse ci-dessous.
- l'un des problèmes autant que je sache est
utf8_general_ci
qui sera apparemment pas une garantie de bonne UTF8 stackoverflow.com/a/1036459/183677. Aussi ces personnages que vous mentionnez sont valables UTF8 hexutf8.com/... (mais je me rends compte de son probablement tout ce que vous voyez dans la console ou quoi que ce soit). paye pour poster les octets - Acc. cette réponse,
mysqli_set_charset($dbc, "utf8");
pourrait aider.
Vous devez vous connecter pour publier un commentaire.
J'ai dû essayer de "réparer" un certain nombre de UTF8 cassé situations dans le passé, et, malheureusement, il n'est jamais facile, et souvent impossible.
À moins que vous pouvez déterminer exactement comment il a été brisé, et il a toujours été cassé dans l'exacte même façon, alors ça va être dur pour "annuler" le dommage.
Si vous voulez essayer de réparer les dégâts, votre meilleur pari serait de commencer à écrire un exemple de code, où vous tentez de nombreuses variations sur les appels à mb_convert_encoding() pour voir si vous pouvez trouver une combinaison de " de " et " à " qui résout vos données. En fin de compte, il est souvent préférable de ne pas même prendre la peine de se soucier de la fixation de la vieille données en raison de la douleur niveaux concernés, mais au lieu de juste corriger les choses à l'avenir.
Toutefois, avant de faire cela, vous devez assurez-vous de réparer tout ce qui est à l'origine de ce problème en premier lieu. Vous avez déjà mentionné que votre table DB classement et les éditeurs sont définies correctement. Mais il y a plus d'endroits où vous devez assurez-vous que tout est bien en UTF-8:
Si vous manquez de place sur une étape à travers l'ensemble de votre processus, l'encodage peut être mutilés et les problèmes se posent. Une fois que vous obtenez dans le "groove" de faire en utf-8 mais, tout cela devient une seconde nature. Et bien sûr, PHP6 est censé être pleinement unicode plainte de la getgo, qui va faire beaucoup de cela plus facile (je l'espère)
Si vous avez double-encodé en UTF8 caractères différents (guillemets, tirets, apostrophes ’, les guillemets “, etc), en mysql, vous pouvez générer les données, puis le lire à fixer le cassé de codage.
Comme ceci:
C'était un 100% correctif pour mon double encodé en UTF-8.
Source:
http://blog.hno3.org/2010/04/22/fixing-double-encoded-utf-8-data-in-mysql/
ssh user@host 'mysqldump --skip-set-charset --default-character-set=latin1 dbname' | mysql --default-character-set=utf8 dbname
Si vous
utf8_encode()
sur une chaîne qui est déjà en UTF-8, puis il semble déformé lorsqu'il est codé en plusieurs fois.J'ai fait une fonction
toUTF8()
qui convertit les chaînes de caractères en UTF-8.Vous n'avez pas besoin de spécifier l'encodage de vos chaînes. Il peut être Latin1 (iso 8859-1), Windows-1252 ou UTF8, ou un mélange de ces trois.
J'ai utilisé moi-même sur une alimentation avec un mélange de codages de la même chaîne.
Utilisation:
Mon autre fonction
fixUTF8()
correctifs de brouillage des chaînes de caractères UTF8 si ils ont été encodés en UTF8 plusieurs fois.Utilisation:
Exemples:
sera de sortie:
Télécharger:
https://github.com/neitanod/forceutf8
J'ai eu un problème avec un fichier xml qui avait une fracture de l'encodage, il a dit qu'il était en utf-8, mais il avait des personnages qui où la pas en utf-8.
Après plusieurs essais et erreurs avec la
mb_convert_encoding()
j'arrive à le fixer aveclatin1_swedish_ci
, sortie par PHP en utf-8, qui montre Umlauteü
commeü
etö
commeö
. Cela a aidé à résoudre ce problème.Que Dan a souligné: vous avez besoin de les convertir en binaire et ensuite de les convertir/corriger l'encodage.
E. g., pour utf8 stockées en tant que latin1 le SQL suivant la corriger:
WHERE LENGTH( field ) != CHAR_LENGTH( field )
😉Je sais que ce n'est pas très élégant, mais après il a été mentionné que les chaînes de caractères peuvent être à double codé, j'ai fait cette fonction:
Cela semble fonctionner parfaitement pour supprimer le double encodage, j'en fais l'expérience. Je suis probablement manque quelques-uns des personnages qui pourraient être un problème pour les autres. Toutefois, pour mes besoins, il fonctionne parfaitement.
La voie est à convertir en binaire, puis à l'encodage correct
Une autre chose à vérifier, ce qui est arrivé à ma solution (qui se trouve ici), est la façon dont les données sont renvoyées à partir de votre serveur. Dans mon application, j'utilise PDO pour se connecter à partir de PHP MySQL. J'ai besoin d'ajouter un drapeau à la connexion qui dit récupérer les données au format UTF-8
La réponse a été
Il ressemble à votre utf-8 est interprété comme iso8859-1 ou Win-1250 à un certain point.
Quand vous dites "Dans ma base de données j'ai un peu de cas de mauvais encodages" - comment avez-vous vérifier? Par le biais de votre application, phpmyadmin ou le client en ligne de commande? Sont tous utf-8 codages montrant comme ça, ou seulement une partie? Est-il possible que vous avait les codages mal, et il a été mal converti à partir iso8859-1 à utf-8 quand il était en utf-8 déjà?
j'ai eu le même problème il y a longtemps, et il a fixé à l'aide de
J'ai trouvé une solution après des jours de recherche. Mon commentaire va être enterré, mais de toute façon...
- Je obtenir la corruption des données avec php.
Je n'utilise pas le nom du set UTF8
- Je utiliser utf8_decode() sur mes données
- Je mettre à jour ma base de données avec mes nouvelles données décodées, toujours pas à l'aide de set names UTF8
et voilà 🙂
Ce script avait une belle approche. La conversion à la langue de votre choix ne devrait pas être trop difficile:
http://plasmasturm.org/log/416/