Récupérer données UTF8

Récupérer données UTF8 - C - Programmation

Marsh Posté le 17-12-2008 à 01:02:18    

Bonjour,
 
Je dois récupérer des données encodées en UTF8 dans une base MySQL. Le problème c'est que les accents ne passent pas :cry:. Je cherche une façon de modifier le charset de mon programme C ou une fonction codant/décodant l'unicode mais je n'ai rien trouvé.
 
Comment puis-je faire pour afficher mes chaines UTF8 accentuées ?

Reply

Marsh Posté le 17-12-2008 à 01:02:18   

Reply

Marsh Posté le 17-12-2008 à 11:15:14    

Si tu récupère bien des chaines UTF8 dans ton programme mais qu'elles ne s'affichent pas correctement lorsque tu les affiche (puts, printf...), c'est que ton terminal n'est pas configuré pour afficher de l'UTF8.
 
Pour convertir ta chaine, tu peux commencer par récupérer le nom du charset à utiliser pour ton terminal avec nl_langinfo(LC_CTYPE), passer ce nom à iconv_open(), puis convertir ta chaine avec iconv().

Reply

Marsh Posté le 17-12-2008 à 12:50:01    

Apparemment toutes ces fonctions sont pour un environnement Unix, j'ai oublié de préciser que je programme sous Windows en ce moment.

Reply

Marsh Posté le 17-12-2008 à 13:55:55    

Gavrinis a écrit :

Bonjour,
 
Je dois récupérer des données encodées en UTF8 dans une base MySQL. Le problème c'est que les accents ne passent pas :cry:. Je cherche une façon de modifier le charset de mon programme C ou une fonction codant/décodant l'unicode mais je n'ai rien trouvé.
 
Comment puis-je faire pour afficher mes chaines UTF8 accentuées ?


Tu peux essayer ces deux codes qui font les conversion ansi -> utf8 et utf8 -> ansi et qui fonctionnent bien.

Code :
  1. char* AnsiToUtf8( const char * ansi, int len )
  2. {
  3. char *ansistr = NULL;
  4. int length = MultiByteToWideChar(CP_ACP, 0, ansi, len, NULL, NULL );
  5. WCHAR *lpszW = NULL;
  6. lpszW = new WCHAR[length+1];
  7. MultiByteToWideChar(CP_ACP, 0, ansi, -1, lpszW, length );
  8. int length1 = WideCharToMultiByte(CP_UTF8, 0, lpszW, length, NULL, 0, NULL, NULL);
  9. ansistr = ( char * ) calloc ( sizeof(char), length1+1 );
  10. WideCharToMultiByte(CP_UTF8, 0, lpszW, length, ansistr, length1, NULL, NULL);
  11. ansistr[length1] = 0;
  12. delete[] lpszW;
  13. return ansistr;
  14. }
  15. char *Utf8ToAnsi(const char * utf8, int len)
  16. {
  17. char *utf8str = NULL;
  18. int length = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, NULL );
  19. WCHAR *lpszW = NULL;
  20. lpszW = new WCHAR[length+1];
  21. MultiByteToWideChar(CP_UTF8, 0, utf8, -1, lpszW, length );
  22. int length1 = WideCharToMultiByte(CP_ACP, 0, lpszW, length, NULL, 0, NULL, NULL);
  23. utf8str = ( char * ) calloc ( sizeof(char), length1+1 );
  24. WideCharToMultiByte(CP_ACP, 0, lpszW, length, utf8str, length1, NULL, NULL);
  25. utf8str[length1] = 0;
  26. delete[] lpszW;
  27. return utf8str;
  28. }


Message édité par Trap D le 17-12-2008 à 13:58:56
Reply

Marsh Posté le 17-12-2008 à 14:26:23    

Et sinon, tu as toujours la solution de d'appeller la dll ICU ( http://www.icu-project.org/ ) et d'utiliser ses fonctions.
C'est ce qu'il y a de mieux, mais c'est un peu gros, et ca demande un peu d'investissement dans la doc pour comprendre comment l'employer.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-12-2008 à 14:35:15    

Malheureusement ça ne fonctionne pas :(
 
Je fais appelle à la fonction comme ceci :

Code :
  1. printf("%s\n", AnsiToUtf8(row[0], 50));

Avec AnsiToUtf8(const char * ansi, int len), j'obtiens "crois├â┬®e",
avec Utf8ToAnsi(const char * utf8, int len), j'obtiens "crois├â┬®e".

Reply

Marsh Posté le 17-12-2008 à 15:48:48    

Gavrinis a écrit :

Malheureusement ça ne fonctionne pas :(
 
Je fais appelle à la fonction comme ceci :

Code :
  1. printf("%s\n", AnsiToUtf8(row[0], 50));

Avec AnsiToUtf8(const char * ansi, int len), j'obtiens "crois├â┬®e",
avec Utf8ToAnsi(const char * utf8, int len), j'obtiens "crois├â┬®e".


Attention, si la chaîne est accentuée il faut l'afficher après un passage par  
BOOL CharToOemBuff(LPCTSTR lpszSrc, LPSTR lpszDst, DWORD cchDstLength)

Reply

Marsh Posté le 17-12-2008 à 17:20:54    

Je ne m'en sors pas, je pense que je vais travailler autrement en remplaçant les caractères accentués par des non accentués.

Reply

Marsh Posté le 17-12-2008 à 17:49:59    

Tiens, simple curiosité. Pourquoi cherches-tu à convertir de l'UTF-8 vers de l'ANSI ? Si c'est pour du debug, à la limite fait un dump dans un fichier et ouvre le avec un truc moins pourri qu'une console MS-DOS.
 
Si c'est pour faire du traitement (nom de fichier, ...), ou ne serait que pour l'affichage à l'utilisateur ça ne serait pas mieux de le convertir en UTF-16 plutôt ?

Reply

Marsh Posté le 17-12-2008 à 19:10:59    

C'est pour du traitement puis de l'affichage, pour le moment j'essaye en console et je pensais tenter en graphique après. Je crois que je vais directement le faire en graphique, j'aurai peut-être moins de problème d'encodage.
 
Pourquoi, y a moyen de le convertir en UTF16 pour un affichage correcte sous DOS ?

Reply

Marsh Posté le 17-12-2008 à 19:10:59   

Reply

Marsh Posté le 17-12-2008 à 19:16:47    

Franchement laisse tomber DOS, et vas direct en graphique. Si tu veux tester, utilise la fonction MessageBoxW et tu pourras transmettre directement des chaines en UTF-16.

Reply

Marsh Posté le 18-12-2008 à 08:34:27    

sous de l'unix, tu passerais par un coup de glib (www.gtk.org) et hop.

Reply

Marsh Posté le 18-12-2008 à 14:40:27    

Merci, je compte aussi faire un client Unix de mon application de toute façon :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed