IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

[MySQL] [XML] problème caractères accentués


Sujet :

SQL Procédural MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut [MySQL] [XML] problème caractères accentués
    Bonjour,
    Sur une installation toute fraîche, Apache2 PHP5 et MySQL5 je n'arrive pas à faire fonctionner les fonctions xml_parse ni simplexml_load_string.
    Mon but est de migrer un CMS qui fonctionnait correctement sur un ancien serveur mais qui plante lamentablement sur cette nouvelle machine.
    Je trouve beaucoup d'exemples d'utilisation du parser avec des fichiers externes, mais pas grand chose avec une base de données.
    Le jeu de caractères pour MySQL est UTF-8 Unicode (utf8).
    Je crée une nouvelle base avec interclassement utf8_general_ci
    Je crée une table avec un seul champ de type "longtext" et interclassement utf8_general_ci
    J'insère un enregistrement, et je tape <TEXTE>Des caractères accentués...</TEXTE>
    Ensuite, en dehors des mysql_connect et mysql_select_db, j'ai dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function fonctionTexte($parseur, $texte) {
      echo $texte."<br/>";
    }
    $parseurXML = xml_parser_create();
    xml_set_character_data_handler($parseurXML, "fonctionTexte");
    $result = mysql_query ("SELECT contenu FROM xml WHERE 1 LIMIT 1 ");
    $ligne = mysql_fetch_array($result);
    print_r($ligne);
    xml_parse($parseurXML,(utf8_decode($ligne[0])));
      echo "Erreur XML : ".xml_error_string(xml_get_error_code($parseurXML))."\n";
    xml_parser_free($parseurXML);
    $xml = simplexml_load_string((utf8_decode($ligne[0])));
    print_r($xml);
    Ce qui me donne comme résultat :
    Array
    (
    [0] => Des caractères accentués...
    [contenu] => Des caractères accentués...
    )
    Des caract?s accentu?..
    Erreur XML : No error
    Des caract?s accentu?..
    SimpleXMLElement Object
    (
    [0] => Des caract?s accentu?..
    )
    J'ai essayé diverses combinaisons, mais visiblement pas la bonne.
    J'espère que quelqu'un aura un exemple à me montrer...
    Merci d'avance !
    Mathieu

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    Points : 422
    Points
    422
    Par défaut
    Il y a une question un peu similaire dans un topic un peu plus bas.

    Il est dit d'aller voir du côté de utf8_decode().

    Bonne journée.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Oui, j'ai vu cette autre discussion, qui ressemble à beaucoup d'autres que j'ai trouvé par google. Mais j'ai bien un utf8_decode à l'appel du parser.

    Si j'enlève le décodage utf8 j'ai cet affichage :

    Array
    (
    [0] => Des caractères accentués...
    [contenu] => Des caractères accentués...
    )
    Des caract
    Erreur XML : Invalid character
    Donc xml_parse commence le boulot mais se bloque dès le premier caractère accentué, et simpleXML n'affiche plus rien du tout...

    J'ai même lu sur un forum un message de quelqu'un qui disait être parvenu au graal en enchaînant deux utf8_decode ! Bigre, j'ai testé :

    Array
    (
    [0] => Des caractères accentués...
    [contenu] => Des caractères accentués...
    )
    Des caract?s accentu?..
    Erreur XML : No error
    Des caract?s accentu?..
    SimpleXMLElement Object
    (
    [0] => Des caract?s accentu?..
    )
    soit donc la même chose qu'avec un seul decode...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    Points : 422
    Points
    422
    Par défaut
    Si tu met ceci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="ISO-8859-1"?>
    en haut de ta page, cela est mieux ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    non, ça me dit ça :

    Array
    (
    [0] => Des caractères accentués...
    [contenu] => Des caractères accentués...
    )
    Des caract?s accentu?..
    Erreur XML : No error
    Des caract?s accentu?..
    SimpleXMLElement Object
    (
    [0] => Des caract?s accentu?..
    )
    j'ai aussi essayé auparavant avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?xml version="1.0" encoding="utf-8"?>

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Hier j'ai vu que dans le httpd.conf il y avait un
    AddDefaultCharset UTF-8
    Je l'ai fait mettre en commentaire depuis.

    J'ai aussi essayé un truc lu dans la doc mysql, avant ma requête select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $result = mysql_query("SET NAMES utf8_general_ci");
    $result = mysql_query("SET CHARACTER_SET utf8_general_ci");
    $result = mysql_query("SET character_set_results utf8_general_ci");
    ou, vice-versa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $result = mysql_query("SET NAMES latin1_swedish_ci");
    $result = mysql_query("SET CHARACTER_SET latin1_swedish_ci");
    $result = mysql_query("SET character_set_results latin1_swedish_ci");
    En fait je cherche un how-to ou un script d'exemple, sur la même configuration, mais pour l'instant je n'ai pas trouvé...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    tiens... je viens d'essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (iconv('UTF-8', 'UTF-8', $ligne[0]) != $ligne[0]) {
           /* It's not UTF-8--for me, it's probably CP1252, the Windows
               version of Latin 1, with directed quotation marks and
               the Euro sign.  */
               echo "pas de l'utf-8 !";
    }
    Eh ben ça me dit que ça n'est pas de l'utf-8 ! Je le savais déjà plus ou moins puisque le print_r de la sortie brute de l'enregistrement ($ligne) affiche les accents sans aucun décodage. D'ailleurs j'ai un meta charset dans mon entête qui est sur iso-8859-1 et quand je le mets sur utf-8 j'ai bien des ? à la place des accents.

    Donc je ne pige pas. Ma base est déclarée en utf-8, mon interclassement aussi, le serveur apache ne précise rien, l'encodage système mysql est positionné sur utf8. Si je crée une nouvelle base, en iso cette fois, le problème ne change pas.

    J'ai lu aussi une astuce qui consiste à changer l'interclassement en passant le type du champ à blob (binaire), puis de le repasser à longtext. Ca me flingue effectivement les caractères au passage, mais le résultat final est le même. Ou alors j'ai mal compris cette manip.

    Je trouve bizarre que ça soit si compliqué avec ma config. Apparamment personne ne semble avoir de problème (google) avec ça. L'install est toute neuve, une fedora core 6...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    suite à lecture instructive du post plus bas....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo mb_detect_encoding($ligne[0], "auto");
    me dit que c'est de l'UTF-8

    je suis totalement perdu...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    OK, pour le fun je viens de faire un truc bizarre, inspiré d'un autre post dans ce forum. Comme il s'agit de migrer une application d'un serveur sur un autre, et que sur l'ancien serveur le parsing xml se passe correctement, je viens de poser sur cet ancien serveur un script qui ne fait qu'extraire le contenu xml de sa table d'origine et un echo de ce contenu.

    Sur le nouveau serveur, je récupére ce contenu par un file_get_contents, et le donne à manger à xml_parse, avec un utf8_decode. Mon xml est lu, mais j'ai des ? à la place des accents, que l'entête html contienne un meta charset utf-8 ou iso, et que la déclaration <?xml version soit présente ou non, en utf-8 ou iso.

    SI je lui donne le flux avec un utf8_encode c'est tout bon, il m'affiche clairement le texte. Je peux même déclarer ma page en ISO, à condition de mettre un utf8_decode dans ma fonction d'affichage de texte.

    Ca me donne donc ça :

    Sur le vieux serveur : fichier export-sql.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    mysql_connect($serveur,$utilisateur,$bddpasse) or die ("connexion base HS");
    mysql_select_db( $bdd ) or die ("sélection base HS");
     
    $result = mysql_query ("SELECT txtContent FROM tblSEDContent_Vers WHERE lngNodId = 2 ORDER BY lngVersion DESC LIMIT 1 ");
     
    $ligne = mysql_fetch_array($result);
     
    echo $ligne[0];
    Sur le nouveau serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    <?
    $entete  = "";
    /*
    $entete .= '<?xml version="1.0" encoding="utf-8"?>';
      */
    $entete .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
    $entete .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">';
    $entete .= '<head>';
     
    //$entete .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
    $entete .= '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">';
     
    echo $entete;
    ?>
     
    <title>Test XML</title></head><body>
    <?
     
    function fonctionTexte($parseur, $texte) {
      echo utf8_decode($texte);
    }
    $parseurXML = xml_parser_create();
    xml_set_character_data_handler($parseurXML, "fonctionTexte");
     
    $monxml = file_get_contents("http://adresse-vieux-serveur/export-sql.php");
     
    xml_parse($parseurXML,(utf8_encode($monxml)));
     
    ?>
    </body></html>
    La question question : où est donc mon problème sur le nouveau serveur ?

    Sur l'ancien je suis en PHP 4.3.11, Apache 1.3.37, Mysql 4.1.14. Le champ concerné est en latin1_swedish_ci.

    Sur le nouveau serveur, je suis en PHP 5.1.6, Apache 2.2.3, Mysql 5.0.27. J'ai essayé de mettre le champ à toutes sortes d'interclassement.

    Je ne vois pas du tout quelle variable vérifier, ni quelle procédure suivre... franchement...

Discussions similaires

  1. [XML] Problème caractère spéciaux !
    Par blanchonvincent dans le forum Flash
    Réponses: 0
    Dernier message: 14/03/2008, 14h06
  2. [VB.NET] Fichier XML et caractères accentués = PROBLEME !
    Par andlio dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 18/02/2008, 09h39
  3. Réponses: 2
    Dernier message: 23/03/2007, 09h41
  4. [PHP][XSLT] problème caractères accentués
    Par beho dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 29/05/2006, 09h29
  5. [Struts] problème caractères accentués
    Par n00noors dans le forum Struts 1
    Réponses: 6
    Dernier message: 10/03/2006, 12h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo