OVH Cloud OVH Cloud

Construire un fichier XML avec des caracteres accentues ?

1 réponse
Avatar
Michel BILLAUD
J'essaie de construire un document XML contenant des caractères
accentués et autres (iso-latin-1) avec php4 4.1.2. J'ai une méthode
qui ne marche pas (facile !), une qui a l'air de marcher, et je
voudrais savoir si - c'est la bonne - si il y a mieux.


CE QUI NE MARCHE PAS

Si je fais ça :

<?php
$doc = new_xmldoc("1.0");
$root = $doc->add_root("mondocument");
$head = $root->new_child("chaine", "hello «éèàôû»");
echo $doc->dumpmem();
?>

je me fais engueuler:

+nereis:~/Essais/XML$ php4 -q b.php
xmlEncodeEntitiesReentrant : input not UTF-8
<?xml version="1.0"?>
<mondocument><chaine>hello &#171;éèàôû»</chaine></mondocument>

et si j'enchaîne avec un reformatage par xmllint, c'est pire :

+nereis:~/Essais/XML$ php4 -q b.php | xmllint --format -
xmlEncodeEntitiesReentrant : input not UTF-8
-:2: error: Input is not proper UTF-8, indicate encoding !
<mondocument><chaine>hello &#171;éèàôû»</chaine></mondocument>
^
-:2: error: Bytes: 0xE9 0xE8 0xE0 0xF4
<mondocument><chaine>hello &#171;éèàôû»</chaine></mondocument>
^
Visiblement, il y a des caractères qui le fâchent.


TENTATIVE DE SOLUTION

Après quelques essais, j'ajoute une traduction par iconv() au moment
de la construction de l'arbre xml :

<?php

function tr($s) {
return iconv("iso-8859-1","UTF-8",$s);
}

$doc = new_xmldoc("1.0");
$root = $doc->add_root("mondocument");
$head = $root->new_child("chaine", tr("hello «éèàôû»"));

echo $doc->dumpmem();
?>

et ça a l'air de marcher :

+nereis:~/Essais/XML$ php4 -q c.php | xmllint --format -
<?xml version="1.0"?>
<mondocument>
<chaine>hello &#xAB;&#xE9;&#xE8;&#xE0;&#xF4;&#xFB;&#xBB;</chaine>
</mondocument>

et même que, si on veut :

+nereis:~/Essais/XML$ php4 -q c.php | xmllint --format --encode iso-8859-1 -
<?xml version="1.0" encoding="iso-8859-1"?>
<mondocument>
<chaine>hello «éèàôû»</chaine>
</mondocument>

Ça a l'air d'aller.

QUESTION:

La traduction vers utf8 est-elle la méthode standard pour construire
un document XML à partir de chaînes non ASCII, ou y a-t-il une autre
façon de faire plus raisonnable ?

MB



--
Michel BILLAUD billaud@labri.fr
LABRI-Universite Bordeaux I phone W: 05 4000 6922 / 05 4000 5792
351, cours de la Liberation http://www.labri.fr/~billaud
33405 Talence (FRANCE) http://dept-info.labri.fr/~billaud

1 réponse

Avatar
Shrom
"Michel BILLAUD" a écrit dans le message de
news:
J'essaie de construire un document XML contenant des caractères
accentués et autres (iso-latin-1) avec php4 4.1.2. J'ai une méthode
qui ne marche pas (facile !), une qui a l'air de marcher, et je
voudrais savoir si - c'est la bonne - si il y a mieux.


CE QUI NE MARCHE PAS

Si je fais ça :

<?php
$doc = new_xmldoc("1.0");
$root = $doc->add_root("mondocument");
$head = $root->new_child("chaine", "hello «éèàôû»");
echo $doc->dumpmem();
?>

je me fais engueuler:

+nereis:~/Essais/XML$ php4 -q b.php
xmlEncodeEntitiesReentrant : input not UTF-8
<?xml version="1.0"?>
<mondocument><chaine>hello &#171;éèàôû»</chaine></mondocument>


La solution est dans le texte, les caractères ne sont pas au format UTF-8
(UTF-8 est l'encodage par défaut de XML et donc de libxml).

Solution: convertir en utf8 les caractères:
$head = $root->new_child("chaine", utf8_encode("hello éééé"));