Forum Programmation.SQL MySQL, PHP et charsets

Posté par  .
Étiquettes : aucune
0
15
jan.
2007
Bonjour à tous,

Je sais que ce sujet revient très régulièrement et que des centaines de sujets ont été lancés sur différents forums mais aucun n'a réussi à me dépanner. Je me tourne donc vers vous. Voilà ma situation :
Je change de serveur web, donc j'ai transféré ma base MySQL (en copiant simplement les fichiers situés dans /var/lib/mysql/ mais j'ai aussi essayé de faire un mysqldump) sur le nouveau serveur. Les deux serveurs MySQL sont en version 5.x
J'ai aussi transféré tous les fichiers du serveur web Apache en les copiant simplement via scp.
Les deux serveurs sont sous PHP version 4.x
Les deux serveurs ont pour locale en_US.ISO8859-1
Les deux serveurs ont comme charset par défaut pour MySQL : latin1
Or, une fois tous les fichiers copiés, lorsque je visualise mes pages web (en l'occurence, c'est un site GRR) j'ai des é à la place des é contenus dans la base MySQL.
J'ai tout essayé. Les mysqldump --default-character-set=latin1 les ALTER DATABSE grr DEFAULT CHARSET latin1 COLLATE latin1_swedish_ci; etc...

Dans le fichier produit par mysqldump, j'ai bien SET NAMES latin1
ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
etc.. latin1 de partout, quoi.
Et quand je regarde manuellement dans la base MySQL, directement en ligne de commande à partir de mon serveur, les accents apparaissent tous bien.

Ah oui, autre chose, lorsque je positionne la variable default_charset = "utf-8" dans mon php.ini, les choses s'inversent, c'est à dire que les accents contenus dans la base MySQL sont bien affichées dans GRR, mais ce sont les accents contenus dans les pages statiques du site qui disparaissent, remplacés par des "?"

Je désespère..

Merci pour les éventuelles réponses.
  • # charset

    Posté par  . Évalué à 1.

    Regarde plutôt du coté de la conf apache (si c'est le serveur que tu utilises)
    et particulièrement du coté de la directive AddDefaultCharset
    • [^] # Re: charset

      Posté par  . Évalué à 1.

      Tout d'abord, merci pour ta réponse.

      J'ai essayé de définir AddDefaultCharset à ISO-8859-1 ou UTF-8 ou à Off, cela ne change rien.
      Ce que je ne comprends vraiment pas, c'est que les données de la base MySQL qui sont sensées être codées en latin1, s'affichent correctement dès lors que l'on dit à PHP d'afficher les données contenues dans les pages web en UTF-8.. C'est totalement incohérent.

      D'autres idées ?
      • [^] # Re: charset

        Posté par  . Évalué à 2.

        Salut,

        1) Plutot que de changer la conf d'Apache... (pour éliminer le fait que ce soit apache le fautif). Ajoute ceci au début de ton script PHP.

        header ('Content-Type: text/html; charset=iso-8859-1');

        De plus, fait un grep -r AddDefaultCharset /etc/apache* pour être certain que cette options ne soit pas définie dans plusieurs fichiers. Genre sous les Debian récentes, de base on a /etc/apache2/conf.d/charset qui courcircuite /etc/apache2/httpd.conf.

        2) Il se peut aussi que ce soit MySQL qui te sorte de l'UTF-8... Exécute ceci avant de faire tes select.

        mysql_query("set names 'latin1';");

        3) Pour avoir été confronté à différents problèmes de charset dernièrement (envoi de mail en différentes langues dont russe depuis PHP et avec des templates de mes messages dans MySQL)... je conseille de migrer vers l'UTF-8 qui est THE unversal solution.
        • [^] # Re: charset

          Posté par  (site web personnel) . Évalué à 1.

          Pour avoir été confronté à différents problèmes de charset dernièrement (envoi de mail en différentes langues dont russe depuis PHP et avec des templates de mes messages dans MySQL)... je conseille de migrer vers l'UTF-8 qui est THE unversal solution.

          Bien dis, mais tu oublie juste un truc, l'extension par défaut mysql supporte pas l'utf-8 (je parle de l'extension php), pour résoudre le soucis il suffit de mettre mysqli (avec un i comme improved a la fin) et zou ça marche ;)

          J'ai très pragmatiquemment passé tous mes codes php en utf-8.

          Après si tu utilise du template, rien de plus simple tu fait un coup de recode a la sortie si le client supporte pas l'utf-8 dans le charset de son choix.
          Bon si ça coince sur certaines lettre, il a qu'a utiliser un navigateur qui tiens la route ;)
          (mais ça devrais pas arriver avec des natifs de l'eu...)
          • [^] # Re: charset

            Posté par  . Évalué à 1.

            Merci à tous pour vos réponses.
            En fait, je pense avoir trouvé l'origine du problème. Je pense que GRR a des difficultés pour gérer l'encodage des caractères dans certaines versions (et notament l'utf-8).
            La solution pour moi a été de dire à GRR d'afficher toutes ses pages PHP avec un charset utf8 puis de convertir les fichiers .php contenant des accents en utf8 également (car elles étaient toutes encodées en iso-8859-1). J'ai encore quelques soucis notament avec une page .php qui génère les noms des mois avec la fonction PHP strftime mais ce n'est pas très important vu qu'ailleurs, la plupart des accents sont revenus, je me pencherai donc sur la question quand j'aurai plus de temps (enfin, si l'un de vous à la solution, je suis preneur quand même ;-) )
          • [^] # Re: charset

            Posté par  (site web personnel) . Évalué à 2.

            Je remercie pas l'imbécile qui m'a "inutilisé", surtout avec une réponse utile et concrète...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.