[RESOLU] problème avec caractères accentués dans flux xml

Petit nouveau ! | 4 Messages

07 avr. 2015, 15:25

Bonjour.

Mon site est en PHP 5.6.5 et mes pages PHP sont encodées en UTF8.

Je récupère des données depuis une base MySQL en utilisant des services Web et quand je teste ces services web depuis le navigateur la réponse est correcte :
- j'ai bien l'entête : <?xml version="1.0" encoding="UTF-8"?>
- quand j'affiche la réponse du service web dans le navigateur, les caractères accentués sont affichés correctement

Dans mon code PHP, je récupère les variables du flux xml renvoyé par le service web en utilisant la librairie nusoap.

Quand je fais un echo de n'importe quelle variable que je récupère ainsi du flux xml, les caractères accentués ne sont pas affichés correctement (des ? dans des losanges au lieu des "é" par exemple), bien que la page HTML renvoyée par PHP comporte l'entête suivant :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<title>home</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

Merci par avance pour vos conseils avisés.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2015, 16:24

Bonjour,

C'est probablement que le flux XML récupéré n'est pas dans le même charset que ta page, du coup il faut que tu utilises les fonctions utf8_encode() ou utf8_decode() avant d'utiliser ces variables.
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

07 avr. 2015, 16:54

Comme indiqué précédemment, le fichier source de ma page PHP est encodé en UTF8, et la page HTML généré par cette page PHP contient les lignes suivantes :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<title>home</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

J'ai ajouté l'appel aux fonctions tu m'as fournies, ça ne change rien.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2015, 19:42

Comment as-tu fait appel à utf8_encode/decode ?
Car ça doit forcément changer quelque chose dans l'affichage de tes variables.
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 3 Messages

08 avr. 2015, 07:33

Envoie en tout premier tes infos en UTF - 8 via le header pour que le serveur comprenne que tu fais passer cet encodage :

<?php
header('Content-Type: text/html; charset=iso-UTF-8');
?>
cela devrait suffire

Petit nouveau ! | 4 Messages

08 avr. 2015, 19:26

Bonjour et merci pour les différentes réponses mais pour l'instant l'affichage est toujours incorrect.
Pour arthur, il y avait en fait quelques changements au niveau de l'affichage, mais mineurs, et pour krief, le header est déjà déclaré en UTF-8 (et non pas iso_UTF-8 mais est-ce vraiment valide ?).
Voici quelques détails supplémentaires.
Ma page PHP appelle le service web suivant :
https://s1.knowledgeplaces.com/KPWS1/se ... nById&id=2
On voit dans la balise <ns1:description> que la description contient des caractères accentués qui sont bien affichés dans le navigateur.
Si on affiche le code source de cet URL, on voit bien la balise <?xml version="1.0" encoding="UTF-8"?>.
J'appelle ce service web en PHP en utilisant la librairie nusoap.
C'est peut être la librairie nusoap que je dois adapter, j'ai commencer à googler dessus et elle a l'air configurée par défaut pour de l'iso-8859.

Mammouth du PHP | 688 Messages

08 avr. 2015, 19:35

En-têtes de la réponse
X-Powered-By: ARR/2.5, ASP.NET
Server: Microsoft-IIS/7.5
Content-Type: text/xml;charset=ISO-8859-1

il y a donc conflit. c'est alors compliqué de ratrapper le coup.

Petit nouveau ! | 4 Messages

08 avr. 2015, 19:49

C'était bien nusoap qui posait problème ! Pour ceux qui rencontrerait le même problème, voici la solution :

1/ Dans nusoap.php :
commenter la ligne : var $soap_defencoding = 'ISO-8859-1';
décommenter la ligne : var $soap_defencoding = 'UTF-8';

2/ Faire de même dans class.nusoap_base.php.

3/ Et à chaque appel de web service, après la ligne :
$client=new nusoap_client($wsdl, 'wsdl');
Ajouter les deux lignes :
$client->soap_defencoding='UTF-8';
$client->decode_utf8 = false;

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 avr. 2015, 19:52

Top !
Merci pour le partage de la solution :-)
Quand tout le reste a échoué, lisez le mode d'emploi...