Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2399 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1672055
babasss
Posté le 16-01-2008 à 12:07:41  profilanswer
 

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
mood
Publicité
Posté le 16-01-2008 à 12:07:41  profilanswer
 

n°1672459
CyberDenix
Posté le 16-01-2008 à 19:03:08  profilanswer
 

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)
n°1672470
babasss
Posté le 16-01-2008 à 19:25:49  profilanswer
 

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
n°1672569
Protohd
Posté le 17-01-2008 à 00:55:49  profilanswer
 

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
n°1672617
babasss
Posté le 17-01-2008 à 09:37:40  profilanswer
 

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
n°1672706
CyberDenix
Posté le 17-01-2008 à 13:17:10  profilanswer
 

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
n°1672730
babasss
Posté le 17-01-2008 à 13:55:28  profilanswer
 

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
n°1673072
babasss
Posté le 17-01-2008 à 23:52:52  profilanswer
 

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
n°1673080
babasss
Posté le 18-01-2008 à 00:40:35  profilanswer
 

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
n°1673571
CyberDenix
Posté le 18-01-2008 à 20:33:58  profilanswer
 

:jap:


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Probleme TtabSheet, Focus et ActiveControl... [Resolu][Résolu][Batch] Fermer une fenêtre
[RESOLU][Oracle - SQL] Problème parsing xml[Access] Importation de fichier texte et perte des espaces
[Résolu] PB pour enregistrer des données dans la BSD ACCESS avec VBA[résolu] Erreur pour validation W3C à cause d'URLs avec paramètres
[Résolu] Includes ne fonctionnent plus depuis session[Résolu]Rétrécir une image
Probleme sur theme Php [résolu][Résolu] problème strstr() et son 3e paramètre
Plus de sujets relatifs à : [Résolu] Parsage d'un flux XML, les accents = découpe du texte


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR