Partage
  • Partager sur Facebook
  • Partager sur Twitter

XML + accents + iconv + free = cauchemard

Je galère sec je n'en peux plus !!!!!!!

Sujet résolu
    4 juillet 2010 à 22:50:48

    Bonjour à tous !

    Je vous explique rapidement, j'espère que vous allez pouvoir m'aider car je sens que je vais vite devenir fou :D

    J'ai un document XML utilisé pour de l'AJAX... Or ce document XML, généré par une page PHP, peut contenir des accents (éâù..) et ceux ci font planter mon script js.

    J'avais, dans un premier temps, réussi à passer outre le problème en utilisant la fonction iconv de cette façon :
    <?php
    echo '<balise value="'.iconv("ISO-8859-1","UTF-8",$table["nom"]).'" /> ';
    ?>
    


    Tout marchait très bien, mais en voulant mettre en ligne le site sur mon hebergeur free, je me suis aperçu que la fonction iconv n'y fonctionne pas...

    J'ai essayé cette méthode, sans succès.

    Si vous connaissez une alternative à cette fonction, sans changer d'hébergeur...

    Je vous remercie d'avance !!!!
    • Partager sur Facebook
    • Partager sur Twitter
      5 juillet 2010 à 0:40:17

      Supprimer les accents, c'est la voie de la facilité, serais-tu faible :-° ?

      As-tu pensé à déclarer le type d'encodage au début de ton xml ?
      <?xml version="1.0" encoding="iso-8859-1" ?>
      
      ou
      <?xml version="1.0" encoding="utf-8" ?>
      
      selon l'encodage utilisé.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        5 juillet 2010 à 8:14:03

        jsais pas, utf8_encode() ?

        sinon utilse json au lieu du xml. C'est beaucoup plus simple a utiliser.
        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2010 à 9:39:34

          Citation : LCaba

          As-tu pensé à déclarer le type d'encodage au début de ton xml ?

          <?xml version="1.0" encoding="iso-8859-1" ?>
          

          ou

          <?xml version="1.0" encoding="utf-8" ?>
          

          selon l'encodage utilisé.


          Oui oui, c'était mes premières pistes, j'ai changé 20 fois l'en tête, ça ne change rien !

          Citation : nod_

          jsais pas, utf8_encode() ?


          Je testerais... (j'ai pas accès au programme là)

          Citation : nod_

          sinon utilse json au lieu du xml. C'est beaucoup plus simple a utiliser.


          Je connais pas, je suis un débutant complet en javascript, je viens d'apprendre les concepts de l'AJAX ! Je ferais des tests avec voir si ça résous mon pb !

          Citation : LCaba

          Supprimer les accents, c'est la voie de la facilité, serais-tu faible :-° ?


          Ben non, justement, je veux pas les supprimer, les accents ! Je veux les transformer en code bizarroïdes genre &e03; !
          • Partager sur Facebook
          • Partager sur Twitter
            5 juillet 2010 à 10:31:06

            Ben htmlentities() alors.

            Normalement pas besoin de utf8_encode() si le codage est bien précisé en début d'xml. Bizarre ton problème, j'ai jamais eu de problème d'encodage avec les xml. Si tu lis ton xml directement depuis le navigateur, ça donne quoi ?

            --

            Json propose une syntaxe moins lourde que l'xml. C'est en fait la syntaxe des objets javascript et par conséquent c'est aussi beaucoup plus simple à exploiter (pas de getElementsByTagName(), getAttribute() ...)
            Voir le tuto : Dynamic Script Loading
            • Partager sur Facebook
            • Partager sur Twitter
              5 juillet 2010 à 22:35:21

              Alors ! J'ai testé htmlentities(), ça converti les accents, parfait... Mais... Toujours une erreru XML ! J'ai ouvert directement le XML, et le navigateur me dit la chose suivante :

              Erreur d'analyse XML : entité non définie
              Emplacement : http://bedweb.free.fr/jeux/guessTheMovie/getInfoFilm.php
              Numéro de ligne 1, Colonne 114 :<?xml version="1.0" encoding="utf-8"?><racine><titre_vo value="Star Wars, Episode V: The Empire Strikes Back" /> <titre_vf value="Star Wars, &eacute;pisode V : L\'Empire contre-attaque" />
              -------------------------------------------------------------------------------------------------------------------------------------------------^


              Bref, il n'aime pas l'accent converti ! :(
              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2010 à 23:24:36

                Ha oui, en fait j'avais déjà tenté le htmlentities() dans un xml et ça va pas : il aime pas le & qui est un caractère spécial. Alors que les accent ne sont pas des caractères spéciaux en xml.

                Tu n'as pas répondu à cette question : "Si tu lis ton xml directement depuis le navigateur, ça donne quoi ?"

                Et poste le code qui génère l'xml aussi
                • Partager sur Facebook
                • Partager sur Twitter
                  5 juillet 2010 à 23:31:59

                  tu veux dire, sans la fonction, avec le "é" brut ? Ça donne ça :

                  Erreur d'analyse XML : mal formé
                  Emplacement : http://bedweb.free.fr/jeux/guessTheMovie/getInfoFilm.php
                  Numéro de ligne 1, Colonne 142 :<?xml version="1.0" encoding="utf-8"?><racine><titre_vo value="Star Wars, Episode V: The Empire Strikes Back" /> <titre_vf value="Star Wars, �pisode V : L\'Empire contre-attaque" />
                  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------^

                  Avec le "�" un espèce de caractère carré avec des "f" dedans que je peux pas mettre ici, sinon ça fait planter mon message dans le SdZ :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 juillet 2010 à 23:36:07

                    C'est ce que tu obtient depuis le navigateur ? Normal qu'il fasse planté ton script il est foireux.
                    Poste le php qui génère ton xml
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 juillet 2010 à 23:38:41

                      Oui, c'est ce que j'avais depuis le navigateur ! OK pour la page, je vais enlever ce qui me semble futile.. ça donne ça :

                      <?php
                      	//Préparation XML
                      	header("Content-Type: text/xml;"); 
                      	echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
                      	echo "<racine>";
                      	
                      	//Connexion BDD
                      	mysql_connect("http://sql.free.fr","***","*******") or die("Impossible de se connecter à la base de donnée");
                      	mysql_select_db("louis_mesnager"); // connection Base de donnée
                      
                      	$reponse = mysql_query("SELECT * FROM films WHERE ID=34");
                      	$table = mysql_fetch_array($reponse);
                      	
                      	
                      	echo '<titre_vo value="'.$table["titre_vo"].'" /> ';
                      	echo '<titre_vf value="'.$table["titre_vf"].'" /> ';
                      	
                      
                      	echo "</racine>";
                      ?>
                      


                      Et dans la base de donnée, l'accent est écrit "normalement"... je vais tester en écrivant directement un accent dans la page PHP

                      EDIT : en écrivant "é" directement sur la page PHP ça fait le même bug !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juillet 2010 à 23:54:28

                        T'es sur que l'encodage renseigné correspond à l'encodage du fichier ?
                        --
                        Image utilisateurDans tous les cas tu dois mettre un htmlspecialchars autour des variables. Sinon les caractère `&`, `"`, `<` ou `>` dans ces variables casseront ton xml.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 juillet 2010 à 0:00:39

                          Citation : LCaba

                          T'es sur que l'encodage renseigné correspond à l'encodage du fichier ?


                          :euh: non !
                          Je crois... "Jeu de caractères pour MySQL: UTF-8 Unicode (utf8) "
                          Et la page XML est en UTF-8...
                          Mais je ne suis pas sûr d'avoir compris ta quesion !

                          Citation : LCaba

                          Image utilisateurDans tous les cas tu dois mettre un htmlspecialchars autour des variables. Sinon les caractère `&`, `"`, `<` ou `>` dans ces variables casseront ton xml.


                          Oui, oui, je vais le faire, je les avais pas encore ajouter pour ne pas alourdir le code pendant que je cherchais l'erreur !

                          je vais essayer d'ajouter utf8_encode() au moment où mes données sont rentrées dans la base de donnée, peut être que ça changera quelque chose..
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 juillet 2010 à 0:10:16

                            Je doute que ça change quoi que ce soit puisque le bug est aussi là quand tu place direct un accent dans le script...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 juillet 2010 à 0:14:37

                              Si en fait ça change, l'XML s'affiche... Mais j'obtiens cela :
                              <racine>
                              <titre_vo value="test"/>
                              <titre_vf value="&eacute;t&eacute;"/>
                              


                              (j'ai mis "été" pour tester)

                              Mais bon, du coup j'ai plus l'accent, mais un code bizarre. Ca fait plus plater le js par contre. Devrais-je faire un utf8_decode() à la sortie ..? Mais c'est une fonction html, je peux pas la mettre dans mon js..

                              EDIT : et quand je regarde le code source de cette page XML j'ai ça :
                              <?xml version="1.0" encoding="utf-8"?><racine>
                              <titre_vo value="test" />
                              <titre_vf value="&amp;eacute;&amp;eacute;&amp;eacute;" />
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 juillet 2010 à 0:39:40

                                é en entité html ça donne &eacute; (acute=aigu). Mais ces entités n'existent pas en xml, donc elle le cassent à cause du `& ` : il faut donc l'échapper en `&amp; `. À la sortie, lorsque le fichier xml est lu, le `&amp; ` est en tant que `& ` puis à l'affichage du html, `&ecaute; ` affiche un `é `. Si si, c'est très clair.

                                Mais si tu as ce problème d'accent (qu'on ne fait que masquer en utilisant les entités html), c'est qu'il y a un problème d'encodage quelque part.

                                Ouvre ton fichier php sous notepad, et vérifie dans le menu "Format" que l'option cochée est "Encoder en UTF-8 (Sans BOM)". Dans le cas contraire, clique sur "Convertir en UTF-8 (Sans BOM)"
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 juillet 2010 à 11:20:58

                                  Essaie de rajouter celle ligne au tout début de ton fichier php :

                                  <?php
                                  header ('Content-Type: text/html; charset=utf-8');
                                  

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 juillet 2010 à 11:52:15

                                    Citation : LCaba

                                    é en entité html ça donne &eacute; (acute=aigu). Mais ces entités n'existent pas en xml, donc elle le cassent à cause du `& ` : il faut donc l'échapper en `&amp; `. À la sortie, lorsque le fichier xml est lu, le `&amp; ` est en tant que `& ` puis à l'affichage du html, `&ecaute; ` affiche un `é `. Si si, c'est très clair.


                                    Oui c'est ce que j'avais cru comprendre.. Mais hélas apparemment quand je récupère la page XML dans mon script (javascript) j'ai du '&eacute;' et pas du 'é' c'est donc inutilisable.

                                    Citation : LCaba

                                    Ouvre ton fichier php sous notepad, et vérifie dans le menu "Format" que l'option cochée est "Encoder en UTF-8 (Sans BOM)". Dans le cas contraire, clique sur "Convertir en UTF-8 (Sans BOM)"


                                    Je ne suis pas sûr que cela changera quelque chose mais soit, j'essaierais ce soir. Mais les caractères qui créent le bug ne viennent pas du bloc note mais de la base de donnée, et elle ont atterrie là bas via un formulaire html/php.

                                    Citation : Darkodam

                                    Essaie de rajouter celle ligne au tout début de ton fichier php :

                                    <?php
                                    header ('Content-Type: text/html; charset=utf-8');
                                    



                                    Alors j'ai testé, ça marche pour le contenu HTML (elle a été encodé en UFT-8) mais ce qui a été rentré dasn le formulaire reste du ISO-8859-1.


                                    --
                                    Sinon, quand je reviens sur mon premier poste, j'y vois que cette fonction marchait pour intégrer les accents :
                                    <?php
                                    iconv("ISO-8859-1","UTF-8",$texte);
                                    

                                    (mais elle ne fonctionne pas sous free)

                                    Cela veut dire que récupère du texte au format "ISO-8859-1". Donc il faudrait que je trouve une fonction "ISO-8859-1" -> UFT-8 autre que iconv, en fait.

                                    EDIT : après recherche, il me semble que mes données sont stockées en ISO-8859-1 sur MySQL, et qu'il faudrait que j'ajoute une requête genre
                                    <?php
                                    mysql_query("SET NAMES 'utf8'");
                                    

                                    Je testerais tout ça ce soir, et je vous tiens au jus.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    XML + accents + iconv + free = cauchemard

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown