[DOM XML] Comment encoder les caracteres accentues du contenu d'un node
2 réponses
Jean-Marc Molina
Bonjour,
Je cherche à générer un fil RSS à l'aide des fonctions DOM XML de PHP. J'ai
une erreur lorsque le contenu de l'élément title contient un caractère
accentué, ce qui est le cas vu que je souhaite nommer mon fil "Mon site -
Actualité", logique :).
Si vous renommez Actualité en Actualite, ça fonctionne. J'ai aussi essayé
d'encoder la chaîne avec la fonction htmlentities mais rien n'y fait.
Le message d'erreur :
Error I get :
XML Parsing Error: not well-formed
Location: news.php?action=syndicate&format=rss2
Line Number 1, Column 102:<?xml version="1.0" encoding="ISO-8859-15"?><rss
version="2.0"><channel><title>Mon site - Actualit
----------------------------------------------------------------------------
-------------------------------------------------^
Le parsing the fichier XML généré s'arrête sur le caractère accentué é de
Actualité.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Marc Molina
Jean-Marc Molina a écrit/wrote :
$title_el->set_content ('Mon site - Actualité');
Il faut utiliser la fonction mb_convert_encoding pour encoder la chaîne au format UTF-8. On peut aussi appeler 2 fois la fonction htmlentities afin de transformer tous les caractères en entités compatibles XML, le jeu est beaucoup plus réduit que celui de HTML.
-- Jean-Marc.
Jean-Marc Molina a écrit/wrote :
$title_el->set_content ('Mon site - Actualité');
Il faut utiliser la fonction mb_convert_encoding pour encoder la chaîne au
format UTF-8.
On peut aussi appeler 2 fois la fonction htmlentities afin de transformer
tous les caractères en entités compatibles XML, le jeu est beaucoup plus
réduit que celui de HTML.
Il faut utiliser la fonction mb_convert_encoding pour encoder la chaîne au format UTF-8. On peut aussi appeler 2 fois la fonction htmlentities afin de transformer tous les caractères en entités compatibles XML, le jeu est beaucoup plus réduit que celui de HTML.
-- Jean-Marc.
Ganf
Le Tue, 21 Sep 2004 15:46:34 +0000, Jean-Marc Molina a écrit :
Pourquoi commences tu à envoyer un prologue XML ? si le doc est un doc XML, les fonctions DOM te retourneront toutes seules ce prologue, pas besoin de le rajouter.
echo ($dom_doc->html_dump_mem ());
Pourquoi fais tu une sortie en mode html ? si tu fais du RSS et si tu met un prologue, c'est que ce que tu envoies est du XML, pas du SGML/HTML. Tu n'es là pas cohérent. Utilises donc un dump_mem() tout bête.
De plus dans ce prologue tu déclares que ton contenu est en ISO-8859-15. Or étrangement tu n'informes pas DOM par la suite que tu aimerais que sa sortie soit effectivement en ISO-8859-15. Il ne respecteras donc pas forcément ton choix (puisque tu ne n'en l'as pas informé). Manque de chance, par défaut DOM sort de l'UTF-8. Donc tu viens de déclarer que ton DOC est en ISO-8859-15 alors qu'il est en UTF-8. Tout ton problème vient de là.
Ne met pas ton prologue et laisse DOM mettre le sien (il ne le fera pas forcément mais s'il ne le fait pas c'est qu'il utilise les défauts XML et il ne faut pas le contredire avec un prologue contraire). De même fais ta sortie en XML (et du coup il devrait effectivement mettre un prologue), tu éviteras les erreurs de syntaxe.
-- Eric Daspet
Le Tue, 21 Sep 2004 15:46:34 +0000, Jean-Marc Molina a écrit :
Pourquoi commences tu à envoyer un prologue XML ? si le doc est un doc
XML, les fonctions DOM te retourneront toutes seules ce prologue, pas
besoin de le rajouter.
echo ($dom_doc->html_dump_mem ());
Pourquoi fais tu une sortie en mode html ? si tu fais du RSS et si tu met
un prologue, c'est que ce que tu envoies est du XML, pas du SGML/HTML. Tu
n'es là pas cohérent. Utilises donc un dump_mem() tout bête.
De plus dans ce prologue tu déclares que ton contenu est en ISO-8859-15.
Or étrangement tu n'informes pas DOM par la suite que tu aimerais que sa
sortie soit effectivement en ISO-8859-15. Il ne respecteras donc pas
forcément ton choix (puisque tu ne n'en l'as pas informé). Manque de
chance, par défaut DOM sort de l'UTF-8. Donc tu viens de déclarer que
ton DOC est en ISO-8859-15 alors qu'il est en UTF-8. Tout ton problème
vient de là.
Ne met pas ton prologue et laisse DOM mettre le sien (il ne le fera pas
forcément mais s'il ne le fait pas c'est qu'il utilise les défauts XML
et il ne faut pas le contredire avec un prologue contraire).
De même fais ta sortie en XML (et du coup il devrait effectivement mettre
un prologue), tu éviteras les erreurs de syntaxe.
Pourquoi commences tu à envoyer un prologue XML ? si le doc est un doc XML, les fonctions DOM te retourneront toutes seules ce prologue, pas besoin de le rajouter.
echo ($dom_doc->html_dump_mem ());
Pourquoi fais tu une sortie en mode html ? si tu fais du RSS et si tu met un prologue, c'est que ce que tu envoies est du XML, pas du SGML/HTML. Tu n'es là pas cohérent. Utilises donc un dump_mem() tout bête.
De plus dans ce prologue tu déclares que ton contenu est en ISO-8859-15. Or étrangement tu n'informes pas DOM par la suite que tu aimerais que sa sortie soit effectivement en ISO-8859-15. Il ne respecteras donc pas forcément ton choix (puisque tu ne n'en l'as pas informé). Manque de chance, par défaut DOM sort de l'UTF-8. Donc tu viens de déclarer que ton DOC est en ISO-8859-15 alors qu'il est en UTF-8. Tout ton problème vient de là.
Ne met pas ton prologue et laisse DOM mettre le sien (il ne le fera pas forcément mais s'il ne le fait pas c'est qu'il utilise les défauts XML et il ne faut pas le contredire avec un prologue contraire). De même fais ta sortie en XML (et du coup il devrait effectivement mettre un prologue), tu éviteras les erreurs de syntaxe.