Pb c# mysql et UTF-8

Trouduc75 Messages postés 2 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 15 octobre 2007 - 15 oct. 2007 à 13:01
Trouduc75 Messages postés 2 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 15 octobre 2007 - 15 oct. 2007 à 16:08
Bonjour les amis.

J'ai un problème avec visual c# mysql et UTF-8.

J'écris actuellement un petit soft de gestion des records pour un serveur de jeu (TMN). Jusqu'à présent les records étaient gérés par des scripts PHP, les informations stockées dans une DB mysql avec des champs au format UTF-8. En PHP je n'ai aucun problème pour utiliser ces chaines de caratères en C# ce n'est pas la même affraire.

Par exemple, un pseudo stocké dans la DB peut être : $i$f60MGRRAL $w??a?y
($i$ff60 et $w correspondent à des codes de couleurs et de largeur de caractère pour un parser propres au jeu...)
Comme vous le voyez ce pseudo utilise des caractères spéciaux.

Une fois stocké dans la DB il apparait de la façon suivante avec dans PHPMyAdmin  : $i$f60mgrral $wСЯαζy/192.168.1.12:2351

Si je récupère cette info par un script PHP j'obtiens le bon jeu de caractères ($i$f60MGRRAL $w??a?y) dans la page web (cf script en fin de message).

En revanche sous C# cela m'est bien impossible j'ai essayé de décoder la chaine en UTF-8 mais en vain. Je ne comprends plus rien.



L'affichage dans la console (ou dans un datagrid dans un form d'appli windows) est irrémédiablement celui que l'on voit sous PHPMyAdmin.

Si je renvoie cette chaine sous le jeu, elle sera mal interprétée, alors que si je le fait en PHP il n'y a aucun problème. Je deviens fou avec ce truc ! Quelqu'un aurait-il une solution ?

Merci d'avance les amis.




J'ai écris à titre d'exemple une appli console illustrant la méthode employé pour illustrer mon propos et ainsi qu’un script PHP réalisant la même opération. Les voici :

DEBUT CODE :


using
System;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>







using
System.Collections.Generic;







using
System.Text;







using
MySql.Data.MySqlClient;







namespace
ConsoleApplication1







{







class

Program








{







static

void Main(string[] args)







{







MySqlConnection
Connex = newMySqlConnection();







MySqlDataAdapter
MyAdapter = newMySqlDataAdapter();







// Define connex string







string
ConnexStr = "Database=" + "aseco" + ";Data Source=" + "localhost" + ";User Id=" + "root" + ";Password=" + "";







Connex.ConnectionString = ConnexStr;







// Open mysql db connex







Connex.Open();







// Define select db query







string
mySelectQuery = "SELECT p.NickName, r.avg FROM players p LEFT JOIN rs_rank r ON (p.Id=r.PlayerId) WHERE r.avg!=0 ORDER BY r.avg ASC LIMIT 5";







// Execute call







MySqlCommand
myCommand = newMySqlCommand(mySelectQuery, Connex);







// Define sql reader







MySqlDataReader
myReader;







// Execute reader







myReader = myCommand.ExecuteReader();







// Look in reader for infos







while
(myReader.Read())







{







// Temporary string buffer







string
myStr = myReader.GetString(0);







Console
.WriteLine(myStr);







// UTF-8 decoding attempt







UTF8Encoding
utf8 = newUTF8Encoding();







String
unicodeString = myStr;







Byte
[] encodedBytes = utf8.GetBytes(unicodeString);







String
decodedString = utf8.GetString(encodedBytes);







Console
.WriteLine("Decoded -> " + decodedString);







}







// Close mysql db connex







Connex.Close();







Console
.ReadKey();







}







}







}






FIN CODE




SCRIPT PHP REALISANT LA MEME OPERATION :

<?php









require_once('connex.inc.php');
require_once('class.parse.php');
require_once('myparam.inc.php');









$idcom=connex('aseco', 'myparam');









$requeterecherche ="SELECT p.NickName, r.avg FROM players p LEFT JOIN rs_rank r ON (p.Id=r.PlayerId) WHERE r.avg!=0 ORDER BY r.avg ASC LIMIT 5";









$result = mysql_query($requeterecherche, $idcom);











while($ligne=mysql_fetch_array($result, MYSQL_NUM))
{
 foreach($ligne as $valeur)
 {
  echo $valeur . "
";
 }
}











?>







FIN SCRIPT

2 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 oct. 2007 à 15:20
hum... je pense qu'il suffit tout simplement de spécifier le jeu de caractères dans la connectionString.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
Trouduc75 Messages postés 2 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 15 octobre 2007
15 oct. 2007 à 16:08
Merci de ta réponse, j'ai bien changé ma connectionString  en :

string

ConnexStr =
"Database=" +
"aseco" +
";Data Source=" +
"localhost" +
";User Id=" +
"root" +
";Password=" +
"" +
";CharSet=latin1";

et c'est pareil. A moins que latin1 ou latin2 ou même utf8 ne soit pas le bon jeu de caractère... C'est toujours pareil ! Y'a un os...

Pourtant dans la doc du connecteur MySql on peut lire en effet :

<hr />
CharSet-or

Character Set, , Specifies the character set that should be used to encode all queries sent to the server. Resultsets are still returned in the character set of the data returned.

<hr />
C'est curieux que ça ne marche pas. J'ai aussi essayé un autre truc, le paramètre BlobAsUTF8IncludePattern, tel qu'on peut le lire dans la doc :
<hr />
BlobAsUTF8IncludePattern, null, Pattern that should be used to indicate which blob columns should be treated as UTF-8.

<hr />avec la connectionString suivante :
string

ConnexStr =
"Database=" +
"aseco" +
";Data Source=" +
"localhost" +
";User Id=" +
"root" +
";Password=" +
"" + 
";BlobAsUTF8IncludePattern=0";

C'est pareil, j'ai aussi essayé les deux en même temps. C'est très bizarre. Je suis loin d'être un pro, mais il y a certainement un truc gros comme maison qui m'échappe. C'est typiquement le genre de connerie qu'on cherche pendant 10 ans alors que c'est tout bête...
0
Rejoignez-nous