Encodage BDD MySQL : Latin -> UTF8

Résolu/Fermé
Ha-Lu Messages postés 66 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 27 novembre 2018 - 28 avril 2014 à 13:31
 rami - 8 juil. 2015 à 12:28
Bonjour,

Je travaille actuellement sur un logiciel de gestion créé par d'autres stagiaires avant moi. Comme il date un peu, l'encodage est en latin1... Et rencontrant de nombreux soucis d'encodage (accents etc.) je voudrais la passer en UTF8. J'ai eu beau tourner et retourner le problème, je ne m'en sors pas...
J'ai déjà fais quelques manipulations infructueuses, à savoir les suivantes :

FICHIERS :

- J'ai d'abord enregistré tous mes fichiers en UTF8 (sans BOM)
- J'ai balisé ces derniers correctement (je pense) à l'aide des balises suivantes :
PHP : header( 'content-type: text/html; charset=utf-8' ); en première ligne des fichiers PHP
HTML : <meta http-equiv="content-type" content="text/html; charset=utf-8" />
dans le balisage de tête.

Théoriquement, le serveur sait qu'il doit me renvoyer de l'UTF8, et mes fichiers sont correctement encodés, non ?
Je pense que le problème vient plutôt de la BDD...

BDD :

- J'ai exporté/réimporté la base de données en utilisant l'encodage utf8_general_ci au lieu de latin1_swedish_ci
- J'ai modifié les scripts pour que tout se fasse correctement en UTF8 :
Ajout de "DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;"
- Lorsque je regarde pour éditer ma BDD (j'utilise HeidiSQL), on m'affiche :
Collation : utf8_general_ci
Serveur par défaut : utf8_general_ci
- Lorsque que je regarde au niveau des variables, à priori pas de soucis, puisque pour la session, tout est en UTF8...

Je désespère un peu... Avez-vous une idée de l'origine du problème ? Et si oui, pourriez-vous me donner une petite piste ? Je vous remercie d'avance !


Ha-Lu.

7 réponses

Utilisateur anonyme
29 avril 2014 à 09:44
Si tu vois des "©" à la place des "é", ça ne veut absolument pas dire que tes données sont en ISO8859-1.
Si tes tables sont bien déclarées en utf-8, ça veut dire au contraire que les données ont subi deux fois le transcodage ISO8859-1 -> utf-8.

Quant à l'image que tu donnes, le é est devenu "é", ça laisse penser que ton "é" a subi ce double et que de plus, tu l'affiches comme si c'était de l'ISO8859-1.
Tu n'utilises pas de utf8_encode dans ton script ?
1
Ha-Lu Messages postés 66 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 27 novembre 2018 7
29 avril 2014 à 13:18
D'accord, je faisais une confusion.
Si, j'avais fais des utf8_encode, dans des fichiers encodés en UTF-8, du coup double encodage...

Finalement, j'ai décidé de revenir sur de l'ISO-8859-1, et ça fonctionne, j'ai réussi à éradiquer les soucis qu'il y avait au départ ! C'était tout simplement qu'une minorité de fichiers avaient été encodés en UTF-8 et pas les autres. C'est ultra-bête mais bon...
Mon CdC est assez chargé et je peux pas perdre trop de temps, mais j'aurais quand même voulu effectuer ce réencodage histoire de pouvoir m'en sortir si ça se reproduit. Je méditerai ça quand j'aurai un peu plus de temps !

Donc en bref, les étapes pour passer en UTF-8 :

-> Réencoder les fichiers avec l'éditeur par exemple ;
-> Penser à baliser les fichiers HTML/PHP ;
-> Exporter et réimporter la base en UTF-8, et réencoder les tables existantes ;
-> Faire attention au double encodage ;

C'est correct ? Je sais plus pourquoi j'ai mis ces utf8_encode, parce que c'est vraiment pas propre du tout et il me semble qu'on est pas censé les utiliser dans ce cas là en plus.

Merci beaucoup le père de ta sympathie et d'avoir accordé autant de temps à mon problème, c'est vraiment super de ta part ! :)
0
Utilisateur anonyme
29 avril 2014 à 14:07
De rien :-)
Dans ta liste des étapes, n'oublie pas d'ajouter le SET NAMES 'utf8' après la connexion.
Et il y a aussi l'utilisation des bibliothèques mb_ (multibyte) sans laquelle la manipulation des chaînes est hasardeuse.
Personnellement, je travaille toujours en utf-8. Je n'utilise le utf8_encode/_decode que pour importer / exporter des données vers des fichiers qui ne sont pas en utf-8, ce qui arrive très très rarement, pour ne pas dire jamais.
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
28 avril 2014 à 13:38
Il y a un soucis dans la ligne <meta http-equiv="content-type" content="text/html; charset=utf-8" />
(ouverture et fermeture de guillemets foireuse)

Remplace là par <meta charset="utf-8" /> et place un <!doctype html> en haut de page
0
Ha-Lu Messages postés 66 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 27 novembre 2018 7
28 avril 2014 à 13:58
J'ai bien peur que le problème ne vienne pas de là : aucun changement...
0
Bonjour

Exécute une requête mysql "SET NAMES 'utf8' " juste après ta connexion à ta base.
Et si tu n'est pas en HTML5, ta balise <meta http-equiv="content-type" content="text/html; charset=utf-8" /> était parfaitement correcte. Elle est juste inutile si tu envoies déjà ces informations par header.
0
Ha-Lu Messages postés 66 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 27 novembre 2018 7
28 avril 2014 à 16:05
Oui j'avais remis le balisage initial car je ne suis justement pas en HTML5...
Quant au SET NAME, il n'a pas marché non plus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 avril 2014 à 16:26
Question bête : tes données sont-elles correctes dans ta base ? Les accents ont-ils l'air corrects avec phpMyAdmin ?
Et quand tu dis que tu as "des soucis d'encodage", peux-tu dire très précisément ce qui ne va pas ?
0
Ha-Lu Messages postés 66 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 27 novembre 2018 7
29 avril 2014 à 08:39
Non, elles ne le sont pas... C'est le cas depuis que j'ai fais les modifications énoncées plus haut. Mes "é" sont des "©". Donc ma base est en UTF8 mais mes données entrées en ISO8859-1, c'est bien ça ?
Pour le reste de la base, c'est correct !
Je vais reprendre à partir d'un exemple :
On entre un ID anomalie, ainsi que sa description, qui est stocké dans la table correspondante. Via le site on peut ouvrir une fiche récapitulative, avec la description récupérée dans le base. Voici ce qui se passe :

- http://hpics.li/aea7020

Pour le site ça va, mais pour ce qui est de la récupération de données (même les anciennes, je conçois que les nouvelles sont mal stockées), c'est la cata...

Je vais essayer de prendre un peu de recul sur tout ça et de reproduire le problème sur moins de fichiers, peut-être que ce sera plus simple pour moi... Je vous tiens au courant si j'arrive à résoudre mon problème !
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
29 avril 2014 à 13:10
essaye ça: http://www.garethsprice.com/blog/2011/fix-mysql-latin1-utf-character-encoding/
0
prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
29 avril 2014 à 13:52
J'ai vu que tu avais passé le sujet en résolu. Est-ce que tu peux expliquer comment tu as résolu le problème ? Ainsi, la personne qui aura le même problème et tombera sur ce topic aura une réponse...
0
Ha-Lu Messages postés 66 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 27 novembre 2018 7
29 avril 2014 à 16:00
Je n'ai pas vraiment résolu le problème en réalité, c'est juste que j'ai repris l'ancienne base qui était en ISO-8859-1 et repassé certains fichiers qui étaient en UTF-8 en ISO-8859-1 également. C'était plus rapide et simple, même si la norme est plus à l'UTF-8 maintenant (quoique pour un intranet français...)
Si je réussis à terminer tout ce que j'ai à faire je m'en occuperai et en rendrai compte ici ou sur un article éventuellement si ça marche. J'ai résumé les étapes principales théorique au dessus, que le père a complétées... Mais étant peu expérimenté je ne préfère pas donner ensuite de fausses manipulations si je n'ai pas eu de résultats.

Merci également pour ton aide et ton lien !
0
ma base deja pleine est ce que je peu corriger ce probleme sans supprimer la base
0