lecture d'un fichier xml : encodage ?

laurentsc
Invité n'ayant pas de compte PHPfrance

14 nov. 2011, 15:21

Bonjour,

je récupère en PHP une liste de noms issue d'un fichier xls, et pour chacun de ces noms, je construis une url :
$url="http://---=".$lastname.","
et ensuite je lis le fichier xml pointé par cette url :
$res=$dom->load($url);  
  $listeText = $dom->getElementsByTagName('text');
  $i=0;
    if ($res) { foreach($listeText as $text) {
	
	if (!(($i++)%3)) {

    $patronyme=strtolower($text->firstChild->nodeValue);
	echo "patr=".$patronyme."<br>";
}}}
Bien sûr, ce code n'est qu'essai.
En général, l'encodage de l'URL (récupéré par mb_detect_encoding($url) ) est de l'ASCII et ça se passe bien ; par contre, il y a un problème si le patronyme est composé en plusieurs morceaux et qu'il vient de ce fichier xls (car si je mets en dûr $lastname="nom en plusieurs parties", ça se passe bien aussi). C'est donc clairement un problème d'encodage. Quelqu'un saurait-il comment je peux m'en sortir ?

Mammouth du PHP | 672 Messages

14 nov. 2011, 15:33

En général, l'encodage de l'URL (récupéré par mb_detect_encoding($url) ) est de l'ASCII et ça se passe bien ; par contre, il y a un problème si le patronyme est composé en plusieurs morceaux et qu'il vient de ce fichier xls (car si je mets en dûr $lastname="nom en plusieurs parties", ça se passe bien aussi).
Bonjour.

Quel est le problème au juste ?
Si j'ai bien compris, c'est la récupération du nom à partir du fichier XLS qui pose problème ? Dans ce cas, pourquoi n'avoir pas mis le code correspondant ?
Toujours si j'ai bien compris, c'est l'URL créée qui est foireuse. Vu que l'URL générée "en dur" est correcte, il faudrait comparer le patronyme récupéré sur le XLS avec celui "en dur"...

Eléphant du PHP | 83 Messages

14 nov. 2011, 15:57

Quel est le problème au juste ?
Tu as raison ; j'ai sauté des points importants, mais tu as bien deviné : c'est la récupération de ce nom depuis le xls qui n'est pas bonne. Voici un extrait du code de récupération des données :
require_once 'excel_reader2.php';
if (isset($_SESSION['nom_fichier'])) 
{ 
$ind=0;
$data = new Spreadsheet_Excel_Reader($_SESSION['nom_fichier']);
$patr="2";
$lastname=$data->val($patr,"3");

while (isset($lastname)&&($lastname!="")) { 
$lastname=$data->val($patr,"3");
$firstname=$data->val($patr,"4");
$patr++;
if ($lastname!="") 
{
$user[$ind]=$lastname.'|'.$firstname;
$ind++;
}}
Je ne connais pas le fichier 'excel_reader2.php' car je m'appuie sur cet outil. Tout ce que je peux dire, c'est qu'il y a environ 1700 lignes de code...
Et pour comparer le nom du xls avec celui en dûr, tu imagines quoi, vu que si je fais un echo, ils sont identiques (d'où ma pensée à un problème d'encodage) ?
Modifié en dernier par laurents le 14 nov. 2011, 19:01, modifié 1 fois.

Mammouth du PHP | 672 Messages

14 nov. 2011, 16:09

Et pour comparer le nom du xls avec celui en dûr, tu imagines quoi, vu que si je fais un echo, ils sont identiques (d'où ma pensée à un problème d'encodage) ?
Si j'ai bien suivi, tu prends ton fichier XLS, tu extrais les noms et tu t'en sers pour générer une URL ?
Il faudrait comparer cette URL avec celle que tu obtiens en utilisant le nom en dur...

Eléphant du PHP | 83 Messages

14 nov. 2011, 16:29

Ce ne sont pas les mêmes :
 echo "comparaison:".strcmp($url,$url_dur)."<br>";
  echo "url:".$url."<br>";
  echo "url_dur:".$url_dur."<br>";
et d'ailleurs, le echo le montre : en dûr, il y a espace, et récupéré du xls, l'espace est remplacé par un carré (d'où encore une fois, je pense à un problème d'encodage). Mais que faire ?

Mammouth du PHP | 672 Messages

14 nov. 2011, 16:51

Ce ne sont pas les mêmes :
 echo "comparaison:".strcmp($url,$url_dur)."<br>";
  echo "url:".$url."<br>";
  echo "url_dur:".$url_dur."<br>";
et d'ailleurs, le echo le montre : en dûr, il y a espace, et récupéré du xls, l'espace est remplacé par un carré (d'où encore une fois, je pense à un problème d'encodage). Mais que faire ?
Comme quoi il y a une différence :mrgreen:

- Il y a des différences/problèmes avec les accents ? Parce que c'est souvent les premiers trucs qui prennent en cas de problème d'encodage.
- Ce qui serait bien, ce serait de savoir à quoi correspond ce "carré". Voir la fonction ord().
- A partir de là, une solution simple, c'est de passer la chaîne à la moulinette, pour transcrire les carrés en blanc...

Accessoirement, l'usage d'espaces est déconseillé dans les URL :roll:

Eléphant du PHP | 83 Messages

14 nov. 2011, 17:44

Grâce à ton aide, c'est résolu (un tout grand merci) : j'ai commencé comme tu me le conseillais par utiliser ord ; j'ai ainsi vu le code ascii du carré, puis je l'ai remplacé par 32 :
$url=str_replace(chr(160),chr(32),$url);
(le code du carré est 160)
Et je sais bien que les espaces ds les urls, c'est pas terrible (Windows n'aime pas), mais ces fichiers xml, je ne les choisis pas (ils sont présents sur un intranet et sont liés au carnet d'adresse).