Bonjour,
voila j'essaie de monter un wiki avec XWiki et j'ai récupéré un tableau de définition à intégrer dans le wiki.
J'ai réussi à créer avec perl la liste des champs à insérer dans la table mais dans les définition il y a souvent des caractères spéciaux tels que é, à, ' ou €.
J'ai réussi afficher les côtes en les doublant et les accents en encodant en UTF-8 (ma table est en latin1 donc je fais un "SET NAMES 'UTF8'" ). Mais pour le € il refuse les requête.
voila un exemple de requête refusée :
use DBI;
use CGI;
use Encode::Encoder qw(encoder);
$co = new CGI;
print $co->header;
$database="test";
$hostname="localhost";
$login = "root";
$mdp = "xxxx";
$dsn = "DBI:mysqlPP:database=$database;host=$hostname;port=3308";
$dbh = DBI->connect($dsn, $login, $mdp) or die "Echec connexion";
$query = "SET NAMES 'UTF8'";
$sth1 = $dbh->prepare($query);
$sth1->execute();
$sth1 -> finish;
$chaine = "80536434, 'Lexique.Arbitrage', 'Arbitrage', 'Arbitrage', '', 'fr', 0, '2008-04-15 18:48:14', '2008-04-15 18:48:14', '2008-04-15 18:48:14', 'XWiki.Root', 'XWiki.Root', 'XWiki.Root', 'Lexique', '1 Arbitrage
Changer le FCPE choisi pour son épargne est possible suivant l''évolution du marché mobilier. Par exemple : quitter un FCPE exposé pour un FCPE équilibré ou l''inverse. Les frais de transfert sont de 2 € par opération.
Source : [Glossaire Systalians>http://10.67.92.110:8080/xwiki/bin/download/Lexique/WebHome/GlossaireSystalians.xls]', '1.1', '', 'WebHome', '', 2, '', '', '', b'0'";
$chaine = Encode::encode("utf8", $chaine);
$requete = "INSERT INTO xwikidoc VALUES(".$chaine.")";
$sth = $dbh->prepare($requete);
$sth->execute();
$sth -> finish;
$dbh -> disconnect;
et voila l'erreur levée :
Aucun dit : DBD::mysqlPP::st execute failed: #HY000Incorrect string value: '\xC2\x80 par...'
for column 'XWD_CONTENT' at row 1 at test_sql.pl line 31.
Ma config :
Windows 2003 Server
MySQL Server 5.0
ActivePerl 5.10
Parce que Latin-1, c'est l'ISO-8859-1, et que ce jeux de caractères ne contient pas le symbole EURO. On crois souvent à tord que c'est du Latin-1, parce que le symbole EURO est inclus dans la page de code Windows-1252, que l'on utilise souvent comme si c'était du Latin-1.... mais Windows-1252, ça, c'est "Latin-Windows" celle-là
Ca n'est d'ailleurs même pas dans l'ISO-8859-2, mais dans l'ISO-8859-15 (Latin9), qui est la version Latin-X spécialement faite pour intégrer le symbole EURO.
Pour le collation, tout dépend de la manière dont tu traite les chaînes dans ta base (ça dépend du sens des données de la base). Je dirais que tu ne dois pas choisir le collation à seule fin de pouvoir faire une comparaison avec un caractère précis. Si tu n'as pas de critère(s) linguistique(s) particulier(s), la collation xxx_bin fait trés bien l'affaire. De toute façon, si tu ne peux pas faire de comparaison sur le symbole EURO, ce n'est à priori pas un problème de collation (car en dehors de la collation par défaut, les collations définissent plutôt des régles de comparaison des chaînes en respect de certaines règles linguistiques).
Reste à voir si la base à bien été convertie..... peut-être qu'exporter les tables, les effacer et les re-importer ferait l'affaire ?
Je sais, c'est radicale, mais c'est ce que j'ai eu à faire récement pour résoudre un problème d'encodage : je n'y étais pas parvenu en agissant sur les données de la base, mais seulement en exportant puis re-important.
Est-ce que c'est une base d'essais ou est-ce que c'est une base installée et en service ? Parce que dans le deuxième cas par contre, il faudra peut-être éviter de s'amuser à ça.
Je repasserai voir le cas plus en détails plus tard, parce que là je me sent un peu "naze" (fatigué).
Si c'est une base d'essai, essai de faire un export/import au moins sur une table significative sur la requête, pour voir si le résultat est le même.
Sinon, voici la syntaxe pour changer soit l'encodage de toute une base, soit l'encodage d'une table seule :
Pour une base toute entière :
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
Pour une table seule :
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
Retour sur une question : pour le collation, je te suggère également utf8_unicode_ci, pour éviter les mauvaises surprises. En tous cas, le xxx_ci est ce qui est le plus souvent attendu (comparaisons des chaînes sans faire de différences entre minuscules et majuscules - ci = case insensitive). Soit utf8_bin, soit utf8_unicode_ci, selon le cas.
__________________________ Lasidoré : Editeur XML orienté sémantique/Online XML editor- Alpha Utiliser le Compilateur Ada GNAT- Fiabilité professionnelle, Ada we trust Opera, Le navigateur- Léger, rapide, efficace, joli et source d'inspiration DragonFly, Le debugger JavaScript, CSS, ... et HTML- Only on Opera Exalead Search- Beceause Google is not a synonym of “ search engine ”
Changer le FCPE choisi pour son +®pargne est possible suivant l''+®volution du march+® mobilier. Par exemple : quitter un FCPE expos+® pour un FCPE +®quilibr+® ou l''inverse. Les frais de transfert sont de 2 -Ç par op+®ration.
Je viens de vérifier : la chaîne 0xC2, 0x80 ne correspond effectivement pas à un caractère connu sous PSPad.
Je viens de décoder manuellement : c'est bien un encodage UTF-8 valide, et il correspond tout simplement au code de caractère 0x80, ou plus strictement, c'est le caractère U+0080 (le bit n° 7 est à 1, donc c'est obligatoirement encodé sur deux octets au moins). Le problème c'est que le caracère U+0080 n'est pas un caractère graphique, mais un caractère de commande (C1). Il ne devrait d'ailleur normalement jamais apparaître dans du texte, et mon parseur UTF-8 maison le rejèterait lui aussi.
Donc MySQL a raison de detecter une erreur, et le problème vient de l'encodage de ta chaîne. Peut-être que le problème vient de Perle.
j'ai donc utilisé un s/€/euros/ pour remplacer le symbole € dans les définitions et idem pour les autres caractères refusés. Ca marche mais si jamais je réutilise le script avec d'autre définitions et qu'il y a des caractères refusés qui ne sont pas dans cette liste il y aura de nouvelles erreurs.
Le code-point Unicode pour ce caractère € est U+20AC. En UTF-8, il s'encode donc 0xE2,0x82,0xAC. En UTF-16LE, c'est 0xAC,0x20.
Et même dans la page de code ISO8859-15, EURO a le code 0xA4.
Je me demande donc d'ou vient la séquence 0xC2,0x80 pour encoder le caractère EURO.
Il y a un problème d'encodage ou de page de code quelque part....
Ce n'est pas normal que des caractères graphiques finissent encodé comme des caractères de commande.
Le format d'encodage UTF-8 est bon. Donc on peut supposer que ce n'est pas l'encodeur UTF-8. Comme nous avons éliminer MySQL comme source possible du problème (il reçois quelque chose d'invalide, il réagis, c'est normal), ne reste alors plus qu'un problème de page de code.