2010-11-23 5 views
0

Hay, j'ai fait une application simple où les utilisateurs téléchargent du contenu dans une base de données MySQL, mais certaines entités ne sont pas en cours d'encodage. Des choses comme celles-ci apparaissentMySQL stocke dans le champ

ââ¬Å 

au lieu de guillemets et de quoi pas. Je sais qu'il aurait dû encoder ces valeurs dans les entités HTML lors de leur insertion dans la base de données, mais il y a maintenant quelques milliers de lignes contenant des données.

Avons-nous une fonction PHP pour encoder ces valeurs lorsque les données sont renvoyées au navigateur?


Alex Brown mise à jour. Étant donné que le codage peut être un problème ici aussi, voici ce que je vois:

alt text

+1

Quel encodage de caractères utilisez-vous dans votre base de données, pour la connexion et pour la sortie? – Gumbo

+0

Est-ce que c'est DEFAULT CHARSET = latin1; – dotty

+0

Nous ne pouvons pas inverser cela sans connaître votre locale/jeu de caractères utilisé – stillstanding

Répondre

4

les navigateurs de vos utilisateurs soumettent des données UTF-8 codé, mais vous vous connectez à une base de données 1) vous suppose soumettent des données codées latin1 2) stocke vos données sous forme de chaînes codées latin1. Vos données sont donc stockées mal codées. Lorsque vous récupérez des données de la base de données, elles sont fournies en tant que chaînes latin1, mais parce que les chaînes latin1 sont juste mal codées en UTF-8, et PHP traite naïvement toutes les chaînes comme des chaînes binaires, vous n'avez que votre UTF-original. 8 cordes de retour. Lorsque vous répercutez cette chaîne sur une page HTML qui est à nouveau déclarée comme codée en UTF-8, la chaîne apparaît telle qu'elle a été soumise par l'utilisateur. Toutefois, si vous affichez le contenu de la base de données à l'aide d'un logiciel ayant une compréhension sophistiquée du traitement des jeux de caractères par MySQL, ce logiciel identifiera les jeux de caractères de colonne comme latin1 et s'assurera que les caractères affichés sont bien les caractères de la chaîne latin1, qui, comme nous l'avons noté, était mal codé UTF-8. Vous voyez donc des données mal codées.

Vous devez prendre un certain nombre de mesures pour y remédier. Tout d'abord, vous vous attendez à manipuler des données codées en UTF-8 (comme déclaré au niveau HTML), vous devez donc vous assurer que c'est aussi la manière dont vous communiquez avec MySQL. Vous le faites en émettant SET NAMES 'utf8' chaque fois que vous formez une connexion à la base de données. (Note: votre API de base de données peut fournir une fonction spéciale pour changer un jeu de caractères de connexion, mais je ne suis pas sûr.)

Deuxièmement, vous devriez vous assurer que vous stockez votre données codées en UTF-8. Cela signifie que les jeux de caractères de vos colonnes de base de données doivent être utf8. Un jeu de caractères de colonne peut être modifié à l'aide de l'instruction ALTER TABLE ... MODIFY. N'oubliez pas de modifier également le jeu de caractères par défaut de la table (cela définit le jeu de caractères pour les nouvelles colonnes ajoutées à la table pour laquelle vous ne spécifiez pas explicitement un jeu de caractères). Et changez le jeu de caractères de base de données pendant que vous y êtes.

Cependant, lorsque vous modifiez un jeu de caractères de colonne, MySQL présume que les données déjà stockées dans les lignes de cette table ne sont pas mal codées, mais des données valides stockées dans l'ancien jeu de caractères. Il va donc convertir vos données UTF-8 mal codées (qu'il traite comme des données encodées en latin1) en données codées en UTF-8, de sorte que vous vous retrouvez avec des données codées en double UTF-8. Il y a une astuce pour contourner ceci: d'abord convertir le jeu de caractères de la colonne en jeu de caractères binary, puis de binary à utf8. Ainsi, MySQL ne modifie pas la forme binaire des données, car vous les convertissez via un format dans lequel elles sont traitées comme des chaînes binaires arbitraires.

Bonne chance!

Questions connexes