problème de codage xml

WRInaute occasionnel
Bonjour,

Je récupère un fichier xml qui est encodé en US-ASCII que je mets en base de donnée mysql.
Dans la base j'ai donc les accents sous cette forme .
exemple:
& #233; => é
& #232;=>è
etc ......

J'ai crée un moteur de recherche dans la base.
Lorsque je cherche par exemple un mot avec accent tel que : " réalisation " , il ne le trouve pas vu apparemment qu'il est écrit sous cette forme " r& #233;alisation " dans la base.

Je ne vois pas trop comment m'en sortir.
Ce que j'ai fais pour l'instant ( ce qui n'est pas la meilleur méthode). Je récupérère le fichier xml, je remplace dedans " & #233; par é " et "& #232; par è " ainsi de suite et je le sauvegarde sous cette forme en bdd.
Maintenant le mot "réalisation" est bien trouvé mais le mot "realisation" sans accent n'est pas trouvé.

c'est terrible ces problèmes d'accent pfffff....

Quelqu'un a une idée pour m'en sortir?

Merci
 
WRInaute accro
seabird a dit:
Je récupère un fichier xml qui est encodé en US-ASCII que je mets en base de donnée mysql.

Et tu le parses avec quoi? Des regexp, ou un vrai parser XML?

seabird a dit:
Dans la base j'ai donc les accents sous cette forme .
exemple:
& #233; => é
& #232;=>è
etc ......

Si tu utilisais un vrai parser XML il te décoderait les entités (tous les &...;), et tu aurais des "vrais" caractères (après il faut s'assurer que la sortie de ton parser XML utilise le même encodage que ta base, je conseille de tout avoir en UTF-8, c'est le plus simple). Même chose pour les entités nommées genre & < etc.

seabird a dit:
Ce que j'ai fais pour l'instant ( ce qui n'est pas la meilleur méthode). Je récupérère le fichier xml, je remplace dedans " & #233; par é " et "& #232; par è " ainsi de suite et je le sauvegarde sous cette forme en bdd.

Je ne sais pas si c'est possible en php (en fait tu ne nous as même pas dit quel language tu utilises), mais en perl tu peux faire un
Code:
s/&#(\d+);/chr($1)/eg
qui te remplace tout ça d'un seul coup plutôt que d'avoir à traiter tous les caractères un par un et d'en oublier la moitié en cours de route.

seabird a dit:
Maintenant le mot "réalisation" est bien trouvé mais le mot "realisation" sans accent n'est pas trouvé.

Ca ça peut être un peu plus compliqué. Il y a peut-être des moyens de faire ça automatiquement en mysql, sinon il faut pouvoir faire une décomposition des caractères Unicode et virer les diacritiques. En perl ça donne ça:

Code:
use Unicode::Normalize;
my $word2 = NFD($word);
$word2 =~ s/\pM//g;
Mais après il faut gérer ça au niveau des index utilisés pour la recherche et tout ça. Comme tu utilises probablement les recherches fulltext de mysql, ce n'est probablement pas la bonne méthode.

Jacques.
 
WRInaute occasionnel
Tout d'abord j'ouvre le fichier xml avec fopen
j'utilise str_replace pour changer les codes:
& #233; => é
& #232;=>è
etc ......

je réenregistre ensuite le fichier ( fput) . ( par contre je n'arrive pas à avoir les retours chariot dans ce nouveau fichier, à la limite cela ne me gène pas)


Ensuite je parse le fichier obtenu avec cette fonction:

Code:
function lit_xml1($fichier,$item,$champs) {
   // on lit le fichier
   if($chaine = @implode("",@file($fichier))) {
      // on explode sur <item>
      $tmp = preg_split("/<\/?".$item.">/",$chaine);
	 
	  $nombre = sizeof($tmp);
	  
      // pour chaque <item>
      for($i=1;$i<$nombre -1;$i+=2)
         // on lit les champs demandés <champ>
         foreach($champs as $champ) {
            $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
			 
            // on ajoute au tableau
            $tmp3[$i-1][] = @$tmp2[1];
			
			
         }
      // et on retourne le tableau
      return $tmp3;
   }
}

et j'enregistre les données obtenues dans la base mysql.

Voila en gros ce que je fais.
Mais j'ai ce problème d'accent ( je croyais que la recherche en base mysql était insensible à la casse)
Je rappelle donc que la recherche marche maintenant avec par exemple "réalisation" mais pas avec "realisation"
voila voila
 
WRInaute occasionnel
ça y est je viens de trouver pourquoi " réalisation" était trouvé et pas "realisation"

En fait la base mysql était en latin1_general_ci , je l'ai mis en utf8_general_ci et maintenant cela fonctionne oufff...

Par contre , je vais quand même aller au bout des choses.
Comment dans le nouveau fichier que j'ai créé ( avant l'intégration en bdd) suite au remplacement des codes:
& #233; => é
& #232;=>è
etc ......
mettre les sauts de lignes ?
Même si cela n'est pas utile, j'aimerais quand même qu'il soit plus lisible si je dois aller y faire un tour.
J'utilise ce code :

Code:
$fichier1 = file_get_contents('http://www.site.com/flux.xml');

$fichier1=str_replace("& #233;","é",$fichier1); 
$fichier1=str_replace("& #232;","è",$fichier1); 
$fichier1=str_replace("& #224;","à",$fichier1); 
$fichier1=str_replace("& #234;","ê",$fichier1); 
$fichier1=str_replace("& #239;","ï",$fichier1); 
$fichier1=str_replace("& #235;","ë",$fichier1); 
$fichier1=str_replace("& #251;","û",$fichier1); 
$fichier1=str_replace("& #231;","ç",$fichier1); 
$fichier1=str_replace("& #238;","î",$fichier1); 
$fichier1=str_replace("& #226;","â",$fichier1); 
$fichier1=str_replace("& #244;","ô",$fichier1); 


  $fp2 = fopen('essai.xml',"w"); 

	           fputs($fp2, "$fichier1"); 

	           fclose($fp2);

Merci
 
Discussions similaires
Haut