[Résolu] Parsage d'un flux XML, les accents = découpe du texte

Parsage d'un flux XML, les accents = découpe du texte [Résolu] - PHP - Programmation

Marsh Posté le 16-01-2008 à 12:07:41    

Bonjour,
 
Je rencontre un problème bloquant en Php sur du parsage XML : il me fait une réaction assez étrange avec les accents.
En effet, si j'essaye de parser le flux suivant :

Citation :


<?xml version='1.0' encoding='UTF-8'?>
<rss  version='2.0'>
<channel>
<item>
<title>La hotline de Microsoft rappelle un utilisateur 10 ans trop tard</title>  
<description>Voilà une histoire qui n'est pas banale, mais qui illustre bien comment une petite erreur peut changer la vie d'un service client. L'histoire en question est celle d'un homme qui a appelé le service technique de Microsoft le 7 janvier 1998 pour ...</description>
</item>
</channel>
</rss>


il va m'indiquer pour la balise title : "La hotline de Microsoft rappelle un utilisateur 10 ans trop tard" => C'est corect :D
Mais pour la balise desciption, il va me l'afficher en deux temps :

  • d'abord la chaine : "Voil"
  • puis le reste : "à une histoire qui n'est pas banale [...]"


et comme je stocke les résultats dans un tableau, il me décale les colonnes et le résultat est horrible.
En fait, il fait ce problème uniquement sur le premier caractère spécial qu'il rencontre (pour les suivants, le fonctionnement est normal).
 
Je sollicite votre aide pour :

  • Comprendre le problème
  • Essayer de le résoudre
  • Où trouver une solution de contournement


Merci d'avance de votre aide
 
NB : POur info le code de mon scipt ci-dessous
 

Code :
  1. <?php
  2.     function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
  3.     { global $derniereBaliseRencontree; $derniereBaliseRencontree = $nomBalise; }
  4.  
  5.     function fonctionBaliseFermante($parseur, $nomBalise)
  6.     { global $derniereBaliseRencontree; $derniereBaliseRencontree = ""; }
  7. function fonctionTexte($parseur, $texte)
  8.     {
  9.         global $derniereBaliseRencontree; 
  10.         switch ($derniereBaliseRencontree) {
  11.             case "TITLE":
  12.                 echo "TITLE : ".$texte."   ";
  13.                 break;
  14.             case "DESCRIPTION":
  15.                 echo "DESCRIPTION : ".$texte."<br>";
  16.                 break;
  17.         }       
  18.     }
  19.     $parseurXML = xml_parser_create();
  20.     xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante" );
  21.     xml_set_character_data_handler($parseurXML, "fonctionTexte" );
  22. xml_parser_set_option($parseurXML, XML_OPTION_TARGET_ENCODING, "UTF-8" );
  23.     $fp = fopen($fichier, "r" );
  24.     if (!$fp) die("Impossible d'ouvrir le fichier XML" );
  25.     // Lecture ligne par ligne
  26.     while ( $ligneXML = fgets($fp, 1024)) {
  27.         xml_parse($parseurXML, $ligneXML, feof($fp)) or die("Erreur XML" );
  28.     }
  29.    
  30.     xml_parser_free($parseurXML);
  31.     fclose($fp);
  32. ?>


Message édité par babasss le 18-01-2008 à 00:45:12

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 16-01-2008 à 12:07:41   

Reply

Marsh Posté le 16-01-2008 à 19:03:08    

A mon avis c'est un problème d'encodage (UTF-8...etc), mais quoi qu'il en soit tu te casses la tête. Il existe de base dans PHP 5 un parseur XML justement nommé SimpleXML.
 
Regarde par ici :
http://stephaneey.developpez.com/t [...] utes/#L2.2


Message édité par CyberDenix le 16-01-2008 à 19:04:00

---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 16-01-2008 à 19:25:49    

Malheureusement, je n'ai pas PHP5 à disposition et je ne peux en aucun cas l'installer...


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 17-01-2008 à 00:55:49    

Bonsoir Babasss,  
 
Comme le disait CyberDenix, je pense aussi que c'est un problème d'encodage UTF8.
 
Aussi je t'invite à regarder le code ci-dessous il devrait t'apporter, je l'espère, des pistes de recherches.
 

Code :
  1. <?PHP
  2. function mon_fichier_xml ()
  3. {
  4. // On déclare la variable XML (c'est pas obligatoire, mais j'aime bien)
  5. $xml = "";
  6. // On commence les premières ligne de ton fichier XML
  7. $xml .= "<?xml version='1.0' encoding='UTF-8'?>
  8. <rss  version='2.0'>
  9. <channel>
  10. <item>
  11. <title>La hotline de Microsoft rappelle un utilisateur 10 ans trop tard</title>
  12. ";
  13. // Pour remarque ne pas faire comme ci-dessous.  
  14. /*
  15. $xml .= "
  16. <?xml version='1.0' encoding='UTF-8'?>
  17. <rss  version='2.0'>  
  18. <channel>
  19. <item>
  20. <title>La hotline de Microsoft rappelle un utilisateur 10 ans trop tard</title>
  21. ";
  22. */
  23. // On met à part les DATA qui posent problème  
  24. $description = "Voilà une histoire qui n'est pas banale, mais qui illustre bien comment une petite erreur peut changer la vie d'un service client. L'histoire en question est celle d'un homme qui a appelé le service technique de Microsoft le 7 janvier 1998 pour ...";
  25. //On vas essayer de les convertir en UTF8 (des fois que .... )
  26. $description = utf8_encode($description);
  27. // On les ajoutes à notre fichiers XML
  28. $xml .= "<description>".$description."</description>";
  29. // On complète le fichier XML
  30. $xml .= "
  31. </item>
  32. </channel>
  33. </rss>
  34. ";
  35. // On retourne le $xml
  36. return $xml;
  37. }
  38. // Test  
  39. $test_xml = mon_fichier_xml ();
  40. Echo $test_xml;
  41. // Ca semble fonctionner :-)
  42. ?>


Message édité par Protohd le 17-01-2008 à 00:57:21
Reply

Marsh Posté le 17-01-2008 à 09:37:40    

Dans ton exemple, tu construis un fichier xml. Moi, mon soucis est d'exploiter un fichier xml qui m'arrive d'un serveur.
 
Sinon, pour rebondir, il s'agit bien d'un problème d'encodage UTF-8 mais au niveau du serveur. J'utilise EasyPhp 2.0.0.0 pour développer et mon code ne marche pas, si je l'envoie sur une page perso de Free, le script marche mieux (il reste un problème avec les quotes, mais les accents passent).
Je suis donc en train de chercher comment régler ca ....


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 17-01-2008 à 13:17:10    

Quelques axes de réflexion :
http://blog.neovov.com/index.php?2 [...] e-en-utf-8
 
Les rares fois où j'ai eu un problème, c'était parce que mon fichier n'était pas bien enregistré en UTF-8 sans BOM (PS-Pad est mon sauveur) ou à cause de la partie base de données (ce qui n'est pas ton cas).
 
Tu peux également tester des  

  • utf8_encode() // ISO-8859-1 -> UTF-8
  • utf8_decode() // UTF-8 -> ISO-8859-1

pour cerner le problème.
 
NB : il se peut aussi que le xml que tu reçois soit encodé en ISO8859-1, malgré la présence de l'entête <?xml version='1.0' encoding='UTF-8'?>.
 
 :hello:


Message édité par CyberDenix le 17-01-2008 à 13:24:38
Reply

Marsh Posté le 17-01-2008 à 13:55:28    

Merci bien pour la doc, je vais me pencher sur les problèmes Apache et Php.
 
Sinon, pour le flux étant donné que c'est notre ami à tous "Google" qui me l'envoie, j'ai tendance (peut-être à tort) à les croire...


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 17-01-2008 à 23:52:52    

Bon alors, j'ai plus réussi à contourner mon problème. En fait, je développais en PHP5 et cela posait visiblement qqs problèmes. En repassant en PHP4, cela marche très bien....
Je ne sais pas très bien pourquoi... (peut-être mes réglages de PHP sont différents entre 4 et 5 ?)


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 18-01-2008 à 00:40:35    

Je ne sais pas trés bien comment j'ai fait mais finalement ca marche en PHP4 (> 4.3) et PHP5 alors je mets le code en espérant que cela serve à d'autre :

Code :
  1. <?php
  2.  function start_element ($parseur, $namebalise, $attribs)
  3.  {
  4.   global $last_viewed_tag;
  5.   $last_viewed_tag = $namebalise;
  6.  }
  7.  //Function for XML parsing
  8.  function end_element ($parseur, $namebalise)
  9.  {
  10.   global $last_end_viewed_tag;
  11.   $last_viewed_tag = "";
  12.   $last_end_viewed_tag = $namebalise;
  13.  }
  14.  //Function for XML parsing
  15.  function Text_function($parseur, $texte)
  16.  {
  17.   global $last_viewed_tag;
  18.   global $special_char;
  19.   //Return UTF-8 special chars with no space
  20.   $texte = trim(strtr($texte, array_flip($special_char)));
  21.   //Convert UTF-8 => ISO-8859-1
  22.   $texte = utf8_decode($texte);
  23.   switch ($last_viewed_tag)
  24.   {
  25.     //Tag <title>
  26.     case "TITLE":
  27.      echo "TITLE : ".$texte."   ";
  28.      break;
  29.     //Tag <description>
  30.     case "DESCRIPTION":
  31.      echo "DESCRIPTION : ".$texte."<br>";
  32.      break;
  33.   }
  34.  }
  35.  //Initializing parameters
  36.  global $special_char;
  37.  //Parameters for XML parsing
  38.  $parseurXML = xml_parser_create();
  39.  xml_parser_set_option($parseurXML,XML_OPTION_TARGET_ENCODING, "ISO-8859-1" );
  40.  xml_set_element_handler($parseurXML, "start_element", "end_element" );
  41.  xml_set_character_data_handler($parseurXML, "Text_function" );
  42.  //Put RSS in one string
  43.  $XML = file_get_contents($filepath);
  44.  //String to escape special chars (for PHP5 Compability)
  45.  $special_char = array("&amp;" => "chr_spec_1",
  46.      utf8_encode("â" ) => "chr_spec_2",
  47.      utf8_encode("ê" ) => "chr_spec_3",
  48.      utf8_encode("î" ) => "chr_spec_4",
  49.      utf8_encode("ô" ) => "chr_spec_5",
  50.      utf8_encode("û" ) => "chr_spec_6",
  51.      utf8_encode("é" ) => "chr_spec_7",
  52.      utf8_encode("à" ) => "chr_spec_8",
  53.      utf8_encode("è" ) => "chr_spec_9",
  54.      utf8_encode("ì" ) => "chr_spec_10",
  55.      utf8_encode("ò" ) => "chr_spec_11",
  56.      utf8_encode("ù" ) => "chr_spec_12",
  57.      utf8_encode("ã" ) => "chr_spec_13",
  58.      utf8_encode("õ" ) => "chr_spec_14",
  59.      utf8_encode("ñ" ) => "chr_spec_15",
  60.      utf8_encode("ä" ) => "chr_spec_16",
  61.      utf8_encode("ë" ) => "chr_spec_17",
  62.      utf8_encode("ï" ) => "chr_spec_18",
  63.      utf8_encode("ö" ) => "chr_spec_19",
  64.      utf8_encode("ü" ) => "chr_spec_20",
  65.      utf8_encode("²" ) => "chr_spec_21" );
  66.  //Escape special chars
  67.  $XML = strtr($XML, $special_char);
  68.  //Parse string
  69.  xml_parse($parseurXML, $XML, strlen($XML)) or die("Erreur XML" );
  70.  //Delete the parser
  71.  xml_parser_free($parseurXML);
  72. ?>


Message édité par babasss le 18-01-2008 à 00:43:59

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 18-01-2008 à 20:33:58    

:jap:


---------------
Directeur Technique (CTO)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed