OVH Cloud OVH Cloud

DOM PHP 5 : caracteres speciaux dans les attributs

13 réponses
Avatar
jamais.content
Bonjour,
J'utilise le DOM de PHP5 pour créer des documents XML.
J'ai un problème avec les accents. J'aimerais créer un noeud :
<input id="name" value="Valeur accentuée">
Pour cela je cree le noeud avec createElement puis je fais un
$node -> setAttribute ("value", $val);
Si je fais $val = "Valeur accentuée", PHP m'insulte au moment du
saveXML. Le caractère accentué a l'air de lui poser problème.
Si je fais $val = "Valeur accentu&eacute;e", PHP remplace
automatiquement le & par un &amp; au moment du saveXML et ce n'est pas
ce que je veux non plus.
Quelqu'un a t-il une solution ?
Merci d'avance.

10 réponses

1 2
Avatar
Michael Alves
Bonjour,
J'utilise le DOM de PHP5 pour créer des documents XML.
J'ai un problème avec les accents. J'aimerais créer un noeud :
<input id="name" value="Valeur accentuée">
Pour cela je cree le noeud avec createElement puis je fais un
$node -> setAttribute ("value", $val);
Si je fais $val = "Valeur accentuée", PHP m'insulte au moment du
saveXML. Le caractère accentué a l'air de lui poser problème.
Si je fais $val = "Valeur accentu&eacute;e", PHP remplace
automatiquement le & par un &amp; au moment du saveXML et ce n'est pas
ce que je veux non plus.
Quelqu'un a t-il une solution ?
Merci d'avance.


Essaye avec un encodage ISO-8859-1.

Avatar
Olivier Miakinen

J'utilise le DOM de PHP5 pour créer des documents XML.
[...]


Essaye avec un encodage ISO-8859-1.


Tiens ? C'est rigolo, mais j'aurais pensé l'inverse : que pour XML cela
doit mieux marcher avec un encodage utf-8.


Avatar
Michael Alves


J'utilise le DOM de PHP5 pour créer des documents XML.
[...]


Essaye avec un encodage ISO-8859-1.



Tiens ? C'est rigolo, mais j'aurais pensé l'inverse : que pour XML cela
doit mieux marcher avec un encodage utf-8.


Je ne suis pas un pro de l'XML, mais perso j'utilise cette encodage
quand j'ai des BuildFiles à faire pour ANT et ça marche très bien.

Normalement l'ISO-8859-1 devrait convenir à tout les pays d'Europe.

Il est peu être (certainement) mieu d'utiliser l'utf-8 ... :)



Avatar
jamais.content
Essaye avec un encodage ISO-8859-1.


C'est déjà celui que j'utilise.

Avatar
Lascap
Quelqu'un a t-il une solution ?
Merci d'avance.


J'ai eu aussi ce genre de problèmes.

$node -> setAttribute ("value", utf8_encode($val)); devrait fonctionner

Lascap

Avatar
jamais.content
J'ajoute que DOMDocument est censé supporter tous les encodages standard.
Il suffit de passer le bon paramètre au constructeur.
Avatar
jamais.content
$node -> setAttribute ("value", utf8_encode($val)); devrait fonctionner


Parfait merci !
J'applique sans comprendre... j'ai l'impression que les specs du DOM
ne sont pas encore très claires.

Avatar
Olivier Miakinen

$node -> setAttribute ("value", utf8_encode($val)); devrait fonctionner


Parfait merci !
J'applique sans comprendre...


Pourtant cela correspond à ma remarque d'hier. Par défaut, XML utilise
le charset UTF-8 sauf si tu spécifies explicitement le contraire. D'un
autre côté, il n'est pas rare que les éditeurs de texte soient par
défaut en iso-8859-1 (voire en cp1252 si tu es sur un système Windows).
Du coup, tu dois transformer ton texte de iso-8859-1 (ou cp1252 qui est
un sur-ensemble de l'autre) en utf-8, or c'est exactement ce que fait la
fonction utf8_encode.

j'ai l'impression que les specs du DOM ne sont pas encore très claires.


Le DOM n'est aucunement en cause ici. Tu lui transmets une chaîne
d'octets qu'il se contente de recopier telle quelle. Le problème vient
de ce que celui qui a écrit la chaîne et celui qui la relit ne parlent
pas le même langage, mais celui qui l'a passée de l'un à l'autre n'est
pas responsable.


Avatar
jamais.content
j'ai l'impression que les specs du DOM ne sont pas encore très claires.


Le DOM n'est aucunement en cause ici. Tu lui transmets une chaîne
d'octets qu'il se contente de recopier telle quelle. Le problème vient
de ce que celui qui a écrit la chaîne et celui qui la relit ne parlent
pas le même langage, mais celui qui l'a passée de l'un à l'autre n'est
pas responsable.


Oui, oui, sauf que j'ai spécifié à "celui qui la relit" mon jeu de
caractères (ISO-8859-1, dans le constructeur de DOMDocument). Je
m'attends donc à ce que les méthodes appliquées à mon instance de DOM
prennent en entrée des chaines dans ce jeu de caractères. C'est bien
un problème de specs. La doc ne précise ce point nulle part.


Avatar
loufoque
Jamais-Content a dit le 15/02/2005 à 20:07:

([...] dans le constructeur de DOMDocument).


l'interface Document n'a pas de constructeur.

D'ailleurs je tiens à signaler que la création de documents se fait avec
DOMImplementation généralement.

La spécification spécifie clairement que les chaînes doivent être en
UTF-16. En PHP, on a déjà des chaînes 8-bit très fonctionnelles alors on
utilise UTF-8.
Le charset d'entrée ou de sortie du document XML n'est affaire que du
module Load & Save.

1 2