Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2007, 12h52   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
Par défaut [MySQL] [XML] problème caractères accentués

Bonjour,
Sur une installation toute fraîche, Apache2 PHP5 et MySQL5 je n'arrive pas à faire fonctionner les fonctions xml_parse ni simplexml_load_string.
Mon but est de migrer un CMS qui fonctionnait correctement sur un ancien serveur mais qui plante lamentablement sur cette nouvelle machine.
Je trouve beaucoup d'exemples d'utilisation du parser avec des fichiers externes, mais pas grand chose avec une base de données.
Le jeu de caractères pour MySQL est UTF-8 Unicode (utf8).
Je crée une nouvelle base avec interclassement utf8_general_ci
Je crée une table avec un seul champ de type "longtext" et interclassement utf8_general_ci
J'insère un enregistrement, et je tape <TEXTE>Des caractères accentués...</TEXTE>
Ensuite, en dehors des mysql_connect et mysql_select_db, j'ai dans mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
FUNCTION fonctionTexte($parseur, $texte) {
  echo $texte."<br/>";
}
$parseurXML = xml_parser_create();
xml_set_character_data_handler($parseurXML, "fonctionTexte");
$result = mysql_query ("SELECT contenu FROM xml WHERE 1 LIMIT 1 ");
$ligne = mysql_fetch_array($result);
print_r($ligne);
xml_parse($parseurXML,(utf8_decode($ligne[0])));
  echo "Erreur XML : ".xml_error_string(xml_get_error_code($parseurXML))."\n";
xml_parser_free($parseurXML);
$xml = simplexml_load_string((utf8_decode($ligne[0])));
print_r($xml);
Ce qui me donne comme résultat :
Citation:
Array
(
[0] => Des caractères accentués...
[contenu] => Des caractères accentués...
)
Des caract?s accentu?..
Erreur XML : No error
Des caract?s accentu?..
SimpleXMLElement Object
(
[0] => Des caract?s accentu?..
)
J'ai essayé diverses combinaisons, mais visiblement pas la bonne.
J'espère que quelqu'un aura un exemple à me montrer...
Merci d'avance !
Mathieu
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 14h11   #2
Membre éclairé
 
Inscription : août 2006
Messages : 379
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : août 2006
Messages : 379
Points : 383
Points : 383
Il y a une question un peu similaire dans un topic un peu plus bas.

Il est dit d'aller voir du côté de utf8_decode().

Bonne journée.
SpiritOfDoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 14h41   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
Oui, j'ai vu cette autre discussion, qui ressemble à beaucoup d'autres que j'ai trouvé par google. Mais j'ai bien un utf8_decode à l'appel du parser.

Si j'enlève le décodage utf8 j'ai cet affichage :

Citation:
Array
(
[0] => Des caractères accentués...
[contenu] => Des caractères accentués...
)
Des caract
Erreur XML : Invalid character
Donc xml_parse commence le boulot mais se bloque dès le premier caractère accentué, et simpleXML n'affiche plus rien du tout...

J'ai même lu sur un forum un message de quelqu'un qui disait être parvenu au graal en enchaînant deux utf8_decode ! Bigre, j'ai testé :

Citation:
Array
(
[0] => Des caractères accentués...
[contenu] => Des caractères accentués...
)
Des caract?s accentu?..
Erreur XML : No error
Des caract?s accentu?..
SimpleXMLElement Object
(
[0] => Des caract?s accentu?..
)
soit donc la même chose qu'avec un seul decode...
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 14h51   #4
Membre éclairé
 
Inscription : août 2006
Messages : 379
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : août 2006
Messages : 379
Points : 383
Points : 383
Si tu met ceci :
Code xml :
<?xml version="1.0" encoding="ISO-8859-1"?>
en haut de ta page, cela est mieux ?
SpiritOfDoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 15h06   #5
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
non, ça me dit ça :

Citation:
Array
(
[0] => Des caractères accentués...
[contenu] => Des caractères accentués...
)
Des caract?s accentu?..
Erreur XML : No error
Des caract?s accentu?..
SimpleXMLElement Object
(
[0] => Des caract?s accentu?..
)
j'ai aussi essayé auparavant avec un
Code :
1
2
 
<?xml version="1.0" encoding="utf-8"?>
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 15h10   #6
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
Hier j'ai vu que dans le httpd.conf il y avait un
AddDefaultCharset UTF-8
Je l'ai fait mettre en commentaire depuis.

J'ai aussi essayé un truc lu dans la doc mysql, avant ma requête select :

Code :
1
2
3
4
 
$result = mysql_query("SET NAMES utf8_general_ci");
$result = mysql_query("SET CHARACTER_SET utf8_general_ci");
$result = mysql_query("SET character_set_results utf8_general_ci");
ou, vice-versa :

Code :
1
2
3
4
 
$result = mysql_query("SET NAMES latin1_swedish_ci");
$result = mysql_query("SET CHARACTER_SET latin1_swedish_ci");
$result = mysql_query("SET character_set_results latin1_swedish_ci");
En fait je cherche un how-to ou un script d'exemple, sur la même configuration, mais pour l'instant je n'ai pas trouvé...
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 15h46   #7
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
tiens... je viens d'essayer ça :

Code :
1
2
3
4
5
6
7
 
IF (iconv('UTF-8', 'UTF-8', $ligne[0]) != $ligne[0]) {
       /* It's not UTF-8--for me, it's probably CP1252, the Windows
           version of Latin 1, with directed quotation marks and
           the Euro sign.  */
           echo "pas de l'utf-8 !";
}
Eh ben ça me dit que ça n'est pas de l'utf-8 ! Je le savais déjà plus ou moins puisque le print_r de la sortie brute de l'enregistrement ($ligne) affiche les accents sans aucun décodage. D'ailleurs j'ai un meta charset dans mon entête qui est sur iso-8859-1 et quand je le mets sur utf-8 j'ai bien des ? à la place des accents.

Donc je ne pige pas. Ma base est déclarée en utf-8, mon interclassement aussi, le serveur apache ne précise rien, l'encodage système mysql est positionné sur utf8. Si je crée une nouvelle base, en iso cette fois, le problème ne change pas.

J'ai lu aussi une astuce qui consiste à changer l'interclassement en passant le type du champ à blob (binaire), puis de le repasser à longtext. Ca me flingue effectivement les caractères au passage, mais le résultat final est le même. Ou alors j'ai mal compris cette manip.

Je trouve bizarre que ça soit si compliqué avec ma config. Apparamment personne ne semble avoir de problème (google) avec ça. L'install est toute neuve, une fedora core 6...
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 16h03   #8
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
suite à lecture instructive du post plus bas....

Code :
1
2
 
echo mb_detect_encoding($ligne[0], "auto");
me dit que c'est de l'UTF-8

je suis totalement perdu...
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 18h53   #9
Invité de passage
 
Inscription : janvier 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 11
Points : 2
Points : 2
OK, pour le fun je viens de faire un truc bizarre, inspiré d'un autre post dans ce forum. Comme il s'agit de migrer une application d'un serveur sur un autre, et que sur l'ancien serveur le parsing xml se passe correctement, je viens de poser sur cet ancien serveur un script qui ne fait qu'extraire le contenu xml de sa table d'origine et un echo de ce contenu.

Sur le nouveau serveur, je récupére ce contenu par un file_get_contents, et le donne à manger à xml_parse, avec un utf8_decode. Mon xml est lu, mais j'ai des ? à la place des accents, que l'entête html contienne un meta charset utf-8 ou iso, et que la déclaration <?xml version soit présente ou non, en utf-8 ou iso.

SI je lui donne le flux avec un utf8_encode c'est tout bon, il m'affiche clairement le texte. Je peux même déclarer ma page en ISO, à condition de mettre un utf8_decode dans ma fonction d'affichage de texte.

Ca me donne donc ça :

Sur le vieux serveur : fichier export-sql.php
Code :
1
2
3
4
5
6
7
8
9
 
mysql_connect($serveur,$utilisateur,$bddpasse) OR die ("connexion base HS");
mysql_select_db( $bdd ) OR die ("sélection base HS");
 
$result = mysql_query ("SELECT txtContent FROM tblSEDContent_Vers WHERE lngNodId = 2 ORDER BY lngVersion DESC LIMIT 1 ");
 
$ligne = mysql_fetch_array($result);
 
echo $ligne[0];
Sur le nouveau serveur :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
<?
$entete  = "";
/*
$entete .= '<?xml version="1.0" encoding="utf-8"?>';
  */
$entete .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
$entete .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">';
$entete .= '<head>';
 
//$entete .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
$entete .= '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">';
 
echo $entete;
?>
 
<title>Test XML</title></head><body>
<?
 
FUNCTION fonctionTexte($parseur, $texte) {
  echo utf8_decode($texte);
}
$parseurXML = xml_parser_create();
xml_set_character_data_handler($parseurXML, "fonctionTexte");
 
$monxml = file_get_contents("http://adresse-vieux-serveur/export-sql.php");
 
xml_parse($parseurXML,(utf8_encode($monxml)));
 
?>
</body></html>
La question question : où est donc mon problème sur le nouveau serveur ?

Sur l'ancien je suis en PHP 4.3.11, Apache 1.3.37, Mysql 4.1.14. Le champ concerné est en latin1_swedish_ci.

Sur le nouveau serveur, je suis en PHP 5.1.6, Apache 2.2.3, Mysql 5.0.27. J'ai essayé de mettre le champ à toutes sortes d'interclassement.

Je ne vois pas du tout quelle variable vérifier, ni quelle procédure suivre... franchement...
Mathcoz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h30.


 
 
 
 
Partenaires

Hébergement Web