Aller au contenu

Pb encodage again


MarvinLeRouge

Sujets conseillés

Salut,

J'ai un pb d'encodage : je dois faire un site en utf-8 (internationalisation, alphabets divers), et je n'y suis pas habitué.

  • J'ai enregistré mes fichiers php en UTF8 sans BOM (quand je mettais UTF8 tout court, j'avais du contenu parasite dans le début d'affichage)
  • J'ai une page de saisie et une page d'affichage
  • Les 2 me sont bien indiquées comme "utf-8" par Firefox
  • le contenu affiché correspond au contenu saisi
  • MAIS le contenu en bdd contient des tas de caractères bizarres dans phpmyadmin , comme si le contenu n'était pas stocké" en utf-8 (alors que la bdd est bien en utf-8)

Mon interprétation : il y a une rupture quelque part dans la chaîne d'encodage (au niveau de la liaison avec la bdd je suppose), mais ce problème est invisible côté client car il y a un passage utf-8 -> iso8859-1 dans un sens et le contraire dans l'autre sens.

Or, je voudrais que le contenu de la bdd soit cohérent, afin d'avoir la possibilité de l'éditer directement via phpmyadmin au besoin.

Please help

Lien vers le commentaire
Partager sur d’autres sites

re,

il faut te connecter à MySQL en UTF-8 également, sinon les données sont traitées comme de l'ISO à l'insertion, et converties de l'UTF-8 à l'ISO lors du select.

Lien vers le commentaire
Partager sur d’autres sites

Non, tout est normal ;)

C'est juste que PHPMyAdmin ne gère pas l'affichage en UTF-8 : tes données sont bien stockées en UTF-8, mais elles sont affichées en ISO, d'où le souci d'affichage.

Tant que tu ne modifies pas tes valeurs via PHPMyAdmin, ça ne devrait pas te causer de souci.

Lien vers le commentaire
Partager sur d’autres sites

Euh au contraire phpMyAdmin est même en UTF-8 par défaut. Si les données ne sont pas rendues correctement à l'affichage, c'est très probablement qu'il y a un soucis en base.

Edit : un test "simple", insérer en base un mot avec des accents du genre Adélaïde. Puis faire un select sur cette table avec pour clause where champ = 'adelaide' (sans aucun accent donc). Si MySQL retrouve le champ, c'est que les données sont correctement encodées.

Lien vers le commentaire
Partager sur d’autres sites

Bon alors :

  • Pour la connexion à la bdd en utf-8, j'ai cru comprendre qu'il fallait utiliser set names, mais quand je l'ai fait ça m'a tout pété, dans la bdd comme à l'affichage
  • Bdd : Jeu de caractères pour MySQL: UTF-8 Unicode (utf8)
  • Bdd : Interclassement pour la connexion MySQL: utf8_unicode_ci
  • Table de test : format Compact, Interclassement latin1_swedish_ci

J'ignore si la table peut avoir un encodage différent de la bdd.

Existe-t-il une marche à suivre, pas à pas, pour être bien sûr de la chaîne d'encodage ?

N.B. : On parle ici d'un site en création, donc les données qui sont actuellement en bdd n'ont aucune importance, je peux les brûler 100 fois si je veux.

Lien vers le commentaire
Partager sur d’autres sites

Pour n'avoir aucune perte, il faut qu'à aucun moment de la chaine les données soient converties en ISO. Donc tes tables doivent être en UTF-8, ainsi que ta connexion, et ton affichage ; ainsi les données seront en UTF-8 du début à la fin.

La "base" en UTF-8, il me semble que ça ne sert que de valeur par défaut lors de la création d'une nouvelle table. Ca sert peut être aussi pour les tables temporaires d'ailleurs, aucune idée.

Interclassement pour la connexion MySQL: utf8_unicode_ci

Ca c'est ce que phpMyAdmin affiche... il annonce fièrement qu'il se connecte en UTF-8, mais ce n'est pas le cas de ton script à toi.

Lien vers le commentaire
Partager sur d’autres sites

Indice supplémentaire : j'ai inséré, avec phpmyadmin, la valeur 'adélaïde'. Si je veux la récupérer depuis ma page de lectyure d'info, il faut que je mette

WHERE titre = '" . utf8_decode ("adélaïde") . "' dans la requète dans ma page.

Comment dois-je faire pour indiquer à mon script de se connecter à la bdd en utf-8, en lecture comme en écriture ?

Lien vers le commentaire
Partager sur d’autres sites

Bon ben c'est pas simple cette histoire :

SET CHARACTER SET UTF8 semble marcher, mais uniquement pour les caractères d'europe de l'ouest.

Si je mets du français ou de l'allemand, ça passe, et le contenuu en bdd est correct.

Si je mets du russe, tout est faux (alors que la représentation bdd était mauvaise avant, mais corrigée à la récupération).

Lien vers le commentaire
Partager sur d’autres sites

Et tu as bien passé ta table en UTF-8 ? Parce que les caractères russes sont typiquement le genre de caractères qui sautent lors d'un passage à l'iso-8859-1.

Lien vers le commentaire
Partager sur d’autres sites

Et bien comment dois-je faire pour "passer ma table en utf-8" ? Ma bdd étant en utf-8 au départ, je pensais que les tables l'étaient elles aussi, et je ne trouve sous phpMyAdmin aucune indication là-dessus.

Pour info, j'ai trouvé une page sous phpMyAdmin affichant un certain nombre de variables de la bdd, voici celles qui me semblaient le plus pertinentes :

character set client utf8

(Valeur globale) latin1

character set connection utf8

(Valeur globale) latin1

character set database latin1

character set filesystem binary

character set results utf8

(Valeur globale) latin1

character set server latin1

character set system utf8

character sets dir /usr/share/mysql/charsets/

collation connection utf8_unicode_ci

(Valeur globale) latin1_swedish_ci

collation database latin1_swedish_ci

collation server latin1_swedish_ci

Lien vers le commentaire
Partager sur d’autres sites

  • Table de test : format Compact, Interclassement latin1_swedish_ci

J'ai mal compris ou bien ici tu disais que ta table de test était en latin1 ?

je ne trouve sous phpMyAdmin aucune indication là-dessus.

Quand tu sélectionnes une base de données tu obtiens la liste de ses tables, et là il y a une jolie colonne "Interclassement"...

Pour changer ça, tu sélectionnes la table, puis tu vas dans Opérations et de là tu changes l'Interclassement.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

J'y comprends rien : quoi que je fasse sur le character set de la table ou son interclassement, rien n'y fait : si je touche au character_set au niveau de la connexion, j'ai du pâté partout; si je n'y touche pas, c'est incorrect dans la bdd, mais correct à la récupération des données.

J'ai essayé diverses options :

mysql_query ("SET CHARACTER SET UTF8");
mysql_set_charset ("utf8");
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
mysql_query("SET NAMES 'utf8'");

J'ai remarqué un truc dans les variables du serveur MySql :

character_set_client utf8

character_set_connection utf8

character_set_database utf8

character_set_filesystem binary

character_set_results utf8

character_set_server latin1

character_set_system utf8

J'ai beau essayer, je ne peux pas passer le character_set_server à utf8. Est-ce que ça ne viendrait pas de là ?

Lien vers le commentaire
Partager sur d’autres sites

Tes données actuelles en base semblent corrompues ; dans quand tu fais tes tests tu recrées bien un jeu de données propre ?

Y a pas 36 étapes :

1) tu crées une table avec un interclassement UTF-8

2) via une connexion UTF-8 (ton script ou phpmyadmin par exemple) tu ajoutes tes données dans la table (sans chercher à faire la moindre conversion, on est en full utf8).

A partir de là, via n'importe quelle connexion en UTF-8 (ton script ou phpmyadmin par exemple), tu devrais pouvoir récupérer correctement tes données, toujours sans la moindre conversion.

EDIT: pour le "character_set_server", il ne sert qu'à déterminer le charset utilisé par défaut quand non précisé. Perso je ne le modifie pas.

Lien vers le commentaire
Partager sur d’autres sites

Hip hip hip hourra ! :D

Bon, j'ai constaté que quand j'insérais des données dans ma table, même depuis phpmyadmin, ça foirait à l'affichage dans phpmyadmin.

J'ai donc suivant tes conseils recréé une table, en choisissant à la création un interclassement utf8_unicode_ci. Et là, pour peu que je mette le SET CHARACTER SET UTF8 à la connexion, ça marche, en écriture et en lecture, aussi bien depuis mon script que dans phpmyadmin.

Bon, je ne peux pas légalement t'épouser en France (je suis déjà marié), donc disons que je te dois un coup à boire la prochaine fois que je passe sur Lyon ou que tu passes sur Toulon. Parce que là, tu m'as enlevé un baobab du pied, honnêtement :thumbup:

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...