Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2950 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Récupérer données UTF8

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récupérer données UTF8

n°1828310
Gavrinis
Open your mind
Posté le 17-12-2008 à 01:02:18  profilanswer
 

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 ?

mood
Publicité
Posté le 17-12-2008 à 01:02:18  profilanswer
 

n°1828385
matafan
Posté le 17-12-2008 à 11:15:14  profilanswer
 

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().

n°1828448
Gavrinis
Open your mind
Posté le 17-12-2008 à 12:50:01  profilanswer
 

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

n°1828480
Trap D
Posté le 17-12-2008 à 13:55:55  profilanswer
 

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
n°1828492
gilou
Modérateur
Modzilla
Posté le 17-12-2008 à 14:26:23  profilanswer
 

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é!  --
n°1828498
Gavrinis
Open your mind
Posté le 17-12-2008 à 14:35:15  profilanswer
 

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".

n°1828585
Trap D
Posté le 17-12-2008 à 15:48:48  profilanswer
 

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)

n°1828672
Gavrinis
Open your mind
Posté le 17-12-2008 à 17:20:54  profilanswer
 

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.

n°1828705
tpierron
Posté le 17-12-2008 à 17:49:59  profilanswer
 

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 ?

n°1828734
Gavrinis
Open your mind
Posté le 17-12-2008 à 19:10:59  profilanswer
 

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 ?

mood
Publicité
Posté le 17-12-2008 à 19:10:59  profilanswer
 

n°1828737
tpierron
Posté le 17-12-2008 à 19:16:47  profilanswer
 

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.

n°1828835
Taz
bisounours-codeur
Posté le 18-12-2008 à 08:34:27  profilanswer
 

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

n°1828990
Gavrinis
Open your mind
Posté le 18-12-2008 à 14:40:27  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Récupérer données UTF8

 

Sujets relatifs
Comment recuperer le username windows sous VBA?[Perl] Récupérer le résultat d'une requète SQL
Urgent SVP : Comment renomer un fichier récupérer par FTPWYSIWYG - Enregistrer code HTML - Recuperer format interprétée
Resolution graphique pour base de donnéesRécuperer des emails, problèmes d'encodages
Recuperer valeur inputbox.Récupérer la saisie sur userform dans la macro
retour à la page précédente : conserver les données de sessionrécupérer données base codé en UTF8
Plus de sujets relatifs à : Récupérer données UTF8


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR