2011-01-11 1 views
0

J'ai construit une API qui renvoie le code XML. Par exemple, l'API retourne:erreur utf8_decode avec l'esperluette (&)

<message>hello, this is a message &amp; it used htmlsepcialchars</message> 

J'utilise file_get_contents() et simplexml_load_string() pour charger les informations renvoyées dans un tableau. J'ai ensuite utilisé utf8_decode() pour convertir le message en un jeu de caractères convivial sur le site web de réception. Cependant, je reçois le message suivant qui points de broches à l'esperluette (&) dans le message:

Warning: main() [function.main]: unterminated entity reference 

En raison de l'esperluette, le reste du message est tronqué. Des idées pour contourner ce problème?

+1

Peut-être 'simplexml_load_string()' rend le '&' en seulement une perluète? Peut-être que ré-encoder cela aiderait. ('htmlentities()' peut aider ici.) – Amber

+0

Commentaire rapide: vous n'avez pas besoin de 'file_get_contents()', utilisez simplement simplexml_load_file ('/ chemin/vers/fichier'); '- Aussi, veuillez fournir un lien au fichier qui produit cette erreur. –

Répondre

0

Trouvé ma réponse, erreur de l'utilisateur. J'étais en train d'échapper à nouveau quelque part dans mon code.

0

il semble que votre esperluette n'est pas encodée, donc soit le décoder en double soit le mettre en champ CDATA.

Habituellement, des caractères spéciaux de ce type doivent être placés dans des champs CDATA. cela évite d'avoir à encoder. php Les fonctions de création DOM ont ce dont vous avez besoin.


$doc->createCDATASection 

et bien sûr:

http://www.w3schools.com/Xml/xml_cdata.asp

et http://fr.php.net/manual/en/function.domdocument-create-cdata-section.php

+0

Il n'y a pratiquement aucun scénario où il est dans votre intérêt de ne pas "encoder" (ou d'échapper, plutôt) des caractères spéciaux. Vous ne voulez pas placer aveuglément le texte entre '' et espérer que le texte ne contienne pas quelque chose qui rendra votre XML invalide. Si vous utilisez des méthodes DOM, l'entrée est automatiquement échappée, y compris pour CDATA, donc pas de problème. –

+0

c'est pourquoi j'ai dit que cela lui avait épargné la peine de le faire. – cromestant

0

Eh bien, les chaînes SimpleXML doivent être codées UTF8 et les valeurs des entités doivent être échappés. Est-ce que utf_decode() est vraiment nécessaire dans votre code?

+0

SimpleXML n'est pas limité à UTF-8, il peut charger la plupart des encodages tant que le fichier est valide (IOW tant que le codage correct est déclaré). –