MarvinLeRouge Posté 31 Octobre 2008 Posté 31 Octobre 2008 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
Kioob Posté 31 Octobre 2008 Posté 31 Octobre 2008 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.
captain_torche Posté 31 Octobre 2008 Posté 31 Octobre 2008 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.
Kioob Posté 31 Octobre 2008 Posté 31 Octobre 2008 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.
MarvinLeRouge Posté 31 Octobre 2008 Auteur Posté 31 Octobre 2008 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.
Kioob Posté 31 Octobre 2008 Posté 31 Octobre 2008 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.
MarvinLeRouge Posté 31 Octobre 2008 Auteur Posté 31 Octobre 2008 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 ?
Kioob Posté 31 Octobre 2008 Posté 31 Octobre 2008 Si tu dois utiliser utf8_decode, c'est que tu as effectivement un soucis. Nous pour passer la connexion MySQL en UTF-8 on utilise ça : SET CHARACTER SET UTF8
MarvinLeRouge Posté 31 Octobre 2008 Auteur Posté 31 Octobre 2008 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).
Kioob Posté 31 Octobre 2008 Posté 31 Octobre 2008 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.
MarvinLeRouge Posté 31 Octobre 2008 Auteur Posté 31 Octobre 2008 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
Kioob Posté 31 Octobre 2008 Posté 31 Octobre 2008 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.
MarvinLeRouge Posté 3 Novembre 2008 Auteur Posté 3 Novembre 2008 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 utf8character_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à ?
Kioob Posté 3 Novembre 2008 Posté 3 Novembre 2008 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.
MarvinLeRouge Posté 3 Novembre 2008 Auteur Posté 3 Novembre 2008 Hip hip hip hourra ! 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
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant