8792 sujets

Développement web côté serveur, CMS

Bonjour à tous,

j'essaye de modifier un document XML qui a cette structure :
<?xml version="1.0" encoding="iso-8859-1"?>
<dictionnaire>
<word word="a thumb" lang="en" type="nom commun" traduction="un pouce"/>
</dictionnaire>

avec DOM (php5).

Voici le code qui permet d'insérer un nouvel élément <word/> (les variables que j'utilise sont issues d'un traitement de $_POST avec htmlspecialchars) :
       /* DOM inclusion */
                $wordlist = new domdocument('1.0', 'iso-8859-1');
		
		$wordlist->load('words.xml');
                
                $newword = $wordlist->createElement('word');
                
                $newword->setAttribute('word',$word);
                $newword->setAttribute('lang',$lang);
                $newword->setAttribute('type',$type);
                $newword->setAttribute('traduction',$translation);
                
                $wordlist->documentElement->appendChild($newword);
                
                $wordlist->save('words2.xml');


Et c'est à ce moment que ça plante : dès que j'utilise un accent (é,à, ê, etc) j'obtiens ce message d'erreur :
a écrit :
Warning: output conversion failed due to conv error in C:\www\langdb\addwords.php5 on line 75

Warning: Bytes: 0xE9 0xE9 0x22 0x20 in C:\www\langdb\addwords.php5 on line 75

Sinon ça marche nikel ...

Mon éditeur enregistre bien mes fichiers en latin1 Smiley confus

Amicalement,

SirWam
Salut,

Es-tu sur que tes variables sont encodés en iso-8859-1 ? Il se peut que ce soit de l'UTF-8 car PHP peut utiliser ce format pour sa gestion interne !

Essaye de faire un test en utilisant la fonction utf8_decode.

De la même manière, que ce passe-t-il si tu ne spécifie pas la version et l'encodage dans le constructeur de ton objet DomDocument (ce sont deux paramètres optionnels)... il est possible que sans les spécifier, PHP s'occupe tout seul de la gestion de l'encodage en interne et ce contente de produire l'encodage necessaire uniquement en sortie.
Modifié par Jep (01 Jun 2005 - 21:04)
Bonsoir,

j'avais essayé l'utf8_decode() et même l'utf8_decode(utf8_encode($var)) pour mes variables POST sans succès : les caractères accentués deviennent des "?" Smiley decu

Et enlever le second et le premier paramètre au constructeur ne change rien ...

Ca doit venir du $_POST qui n'est pas encodé en latin1, mais je n'ai rien trouvé dans la doc à ce sujet.

Et j'ai vraiment pas envie de tout passer en UTF-8 pour cette application Smiley confus

En tout cas, merci de ta réponse. Je vais continuer mes investigations.

Cya
SirWam a écrit :
Ca doit venir du $_POST qui n'est pas encodé en latin1, mais je n'ai rien trouvé dans la doc à ce sujet.


C'est possible en effet, et ça depend du naviagteur et de l'encodage de la page d'envoi.

Eventuellement, va regarder du coté de la fonction :
> http://fr3.php.net/manual/fr/function.mb-convert-encoding.php
Elle permet de forcer l'encodage de caractère

Cette fonction necessite l'installation du module mbstring :
> http://php.net/mbstring


Smiley smile
je pense qu'une question similaire a déjà été posée sur le forum, faut chercher...

moi j'avais remédié au problème en rajoutant un élément CDATA via une fonction dom...
Bonjour à tous,

j'ai réglé mon problème d'une manière très peu satisfaisante en encodant mes données issues de $_POST en utf8 grâce à la fonction utf8_encode ... alors qu'absolument tout dans mon application est en iso-8859-1.

Merci à tous quand même.

Amicalement,

SirWam
Bonjour,

Juste pour signaler que le même problème m'a conduit à la même solution.
J'en profite pour poster un prototype du bug.

1. Le document XML (encodé en ISO-8859-1):

<?xml version="1.0" encoding="ISO-8859-1"?>
<racine>
</racine>


2. Le document PHP (encodé en ISO-8859-1):

<?php

/* ne pas contourner le bug */
ob_start() ;
$doc = DOMDocument::load("test.xml") ;
$doc->documentElement->nodeValue = [b]"Valeur par défaut"[/b] ;
echo $doc->saveXML() ;
file_put_contents("test-ko.txt", ob_get_clean()) ;

/* contourner le bug */
ob_start() ;
$doc = DOMDocument::load("test.xml") ;
$doc->documentElement->nodeValue = [b]utf8_encode("Valeur par défaut")[/b] ;
echo $doc->saveXML() ;
file_put_contents("test-ok.txt", ob_get_clean()) ;

?>


3. Le fichier test-ko.txt (encodé en ISO-8859-1):

<br />
<b>Warning</b>:  DOMDocument::saveXML() [<a href='function.saveXML'>function.saveXML</a>]: output conversion failed due to conv error, bytes 0xE9 0x66 0x61 0x75 in <b>C:\WWWROOT\pap-annonces.fr\test.php</b> on line <b>7</b><br />
<?xml version="1.0" encoding="ISO-8859-1"?>
<racine>Valeur par d


4. Le fichier test-ok.txt (encodé en ISO-8859-1):

<?xml version="1.0" encoding="ISO-8859-1"?>
<racine>Valeur par défaut</racine>


Pour information, en ISO-8859-1 les codes 0xE9 0x66 0x61 0x75 représentent respectivement les caractères : "é", "f", "a", "u"
Modifié par elvex (20 Apr 2006 - 14:00)
Pour éviter ce genre d'erreur :


Warning: output conversion failed due to conv error in C:\www\langdb\addwords.php5 on line 75

Warning: Bytes: 0xE9 0xE9 0x22 0x20 in C:\www\langdb\addwords.php5 on line 75

Penser à appeler le constructeur après la déclaration:

$dom = new DomDocument('1.0', 'ISO-8859-1');
$dom->__construct();

Modifié par eee (27 Feb 2007 - 14:07)