[résolu ] Conversion UTF-8 => OEM

Conversion UTF-8 => OEM [résolu ] - C - Programmation

Marsh Posté le 15-04-2004 à 22:27:45    

Voilà, je programme avec Gtk. Or, les chaine retournées sont de types UTF-8, et moi, j'ai besoin de faire des comparaisons pour savoir si par exemple, la chaine contient un 'é', pour le transformer en 'e'.
Le problème est que lors de la compilation les caractères entré dans le programme sont codé en OEM.
Donc, je cherche une fonction qui permettrait cette conversion.
J'ai entendu parler de WideCharToMultiByte sur http://msdn.microsoft.com/library/ [...] e_2bj9.asp mais je n'arrive pas à l'utiliser correctement.
Merci et @+++


Message édité par GOUGOU1 le 16-04-2004 à 14:24:58
Reply

Marsh Posté le 15-04-2004 à 22:27:45   

Reply

Marsh Posté le 15-04-2004 à 22:32:15    

y a des fonctions dans la glibc pour faire je crois bien. Je regarde ça et je poste ;)

Reply

Marsh Posté le 15-04-2004 à 22:38:45    

OEM ça n'existe pas. il faut que tu fasses une conversion  
 
http://developer.gnome.org/doc/API [...] #id2653955

Reply

Marsh Posté le 16-04-2004 à 00:59:21    

Je maintiens ce que je dis, OEM existe
 
http://msdn.microsoft.com/library/ [...] e_17si.asp
C'ets le codage utilisé par windob.
Sinon, les fonction que tu m'a montré je les connais déjà, mais j'arrive pas à le sutiliser, cela plente toujours.
J'abuserais peut etre en te demandant de me faire un petit exemple d'utilisation  :D ?

Code :
  1. /* renvoie l'équivalent de Src en codage OEM */
  2. char Conv_UTF8_OEM(const gchar Src)
  3. {
  4. /* chaine temporaire */
  5. char* Res;
  6. gchar Temp[1];
  7. gsize *a;
  8. /* création de la chaine temporaire */
  9. Temp[0] = Src;
  10. /* conversion en OEM */
  11. //WideCharToMultiByte(CP_ACP,0,(LPWSTR) Temp,1, Res,1,NULL,NULL);  
  12. Res = g_convert (Temp,1,"CP_OEMCP","CP_UTF8",NULL,a,NULL);
  13. return Res[0];
  14. }


Ce code compile mais plante, en fait, je sais pas quoi mettre pour les champ 3 et 4 et çà viens de là.
Pourrais tu m'expliquer quoi mettre ?
Merci, et @++

Reply

Marsh Posté le 16-04-2004 à 08:53:47    

3 et 4 je ne sais pas non plus.
Ta variable "a" pointe sur rien par contre. C'est sans doute là que ça coince. Essaye :
gsize a;
Res = g_convert (Temp,1,"CP_OEMCP","CP_UTF8",NULL,&a,NULL);

Reply

Marsh Posté le 16-04-2004 à 10:20:28    

ah ouais !.
 

Code :
  1. /* conversion de chaine UTF-8 <=> OEM */
  2. #include <windows.h>
  3. #include <gtk/gtk.h>
  4. /* renvoie l'équivalent de Src en codage OEM */
  5. char Conv_UTF8_OEM(const gchar Src)
  6. {
  7. /* chaine temporaire */
  8. char* Res;
  9. gchar Temp[1];
  10. gsize b;
  11. gsize *a = &b;
  12. /* création de la chaine temporaire */
  13. Temp[0] = Src;
  14. /* conversion en OEM */
  15. //WideCharToMultiByte(CP_ACP,0,(LPWSTR) Temp,1, Res,1,NULL,NULL);  
  16. Res = g_convert (Temp,1,"CP_OEMCP","CP_UTF8",NULL,a,NULL);
  17. return Res[0];
  18. }


mais çà marche toujours pas, c'est vrais que mon pointeur a ne pointait nul part, mais de toute façon, çà change rien, car ce paramètre peut etre NULL, donc voilà.
Ce sont ces [:aless] de paramètres 3 et 4 qui doivent foirer à mon avis.
Est-ce que quelqu'un sait comment faire ?
merci, @++

Reply

Marsh Posté le 16-04-2004 à 10:47:47    

Tu les as trouvés où tes paramètres 3 & 4 ?
J'ai trouvé des exemples où les paramètres sont :
"UTF-8", "ISO-8859-1", "CP1251", "UCS-2BE"...
Essaye de remplacer ton CP_UTF8 par UTF-8 et ton CP_OEMCP par un autre pour voir ;)


Message édité par Vinx le 16-04-2004 à 10:48:10
Reply

Marsh Posté le 16-04-2004 à 12:35:03    

mes paramères 3  et 4, je les ais trouvé pour une autre fonction, mais j'ai fait la recherche de mon coté, et je remplace "CP_UTF8" par "UTF-8" et la, je cherche pour l'autre paramètre.
C'est bien "ISO-8859-1"; mais le dernier chiffre change selon le pays, et je cherche ddonc une table qui me l'indique.
@++

Reply

Marsh Posté le 16-04-2004 à 12:37:36    

Citation :

ISO 8859-1 Langues ouest-européennes (Latin-1)
ISO 8859-2 Langues est-européennes   (Latin-2)
ISO 8859-3 Sud-Est européens et diverses langues (Latin-3)
ISO 8859-4 Scandinavie/baltique (Latin-4)
ISO 8859-5 Latin/cyrillique
ISO 8859-6 Latin/arabe
ISO 8859-7 Latin/grec
ISO 8859-8 Latin/hébreu
ISO 8859-9 Latin-1 modifié pour le turc  (Latin-5)
ISO 8859-10 Langages lappon/nordique/eskimo (Latin-6)
ISO 8859-11 Thaï
ISO 8859-13 Langues baltiques (Latin-7)
ISO 8859-14 Celtique (Latin-8)
ISO 8859-15 Langues ouest-européennes (Latin-9)


 
http://docs.mandragor.org/files/Op [...] o_8859-1.7
 
j'espère que çà va résoudre mon problème
@++

Reply

Marsh Posté le 16-04-2004 à 13:31:14    

   gsize b;
     gsize *a = &b;  
 
 
pas mal inutile ça

Reply

Marsh Posté le 16-04-2004 à 13:31:14   

Reply

Marsh Posté le 16-04-2004 à 14:03:34    

oué, mais dire que c'ets intuitl, çà fait pas avancer le smilblick  :lol:  
Je sais que j'aurais pu faire  
 

Code :
  1. gsize a;
  2. ....&a);


 
@++

Reply

Marsh Posté le 16-04-2004 à 15:59:12    

Résolu ? T'as fait quoi finalement ?
C'est toujours intéressant de savoir :)

Reply

Marsh Posté le 16-04-2004 à 20:15:04    

ah oui, excuse, je me sauvais comme un voleur  :lol:  
 
/* conversion de chaine UTF-8 <=> OEM */
#include <gtk/gtk.h>
#include <string.h>
 

Code :
  1. /* renvoie l'équivalent de Src en codage OEM */
  2. void Conv_UTF8_OEM(const char* Src, char *Res)
  3. {
  4. /* chaine temporaire */
  5. char *Temp; /* pointeur sur résultat */
  6. /* conversion en OEM */
  7. Temp = g_convert(Src,strlen(Src),"iso8859-1","utf-8",NULL,NULL,NULL);
  8. /* recopie du résultat */
  9. strcpy(Res,Temp);
  10. }


 
et surtout, j'ai fais çà :

Code :
  1. Conv_UTF8_OEM(gtk_entry_get_text(List_Objets->pGet_Nom),Nom);


c'est ce qui cahnge tout le problème.
En fait, au début, je copiais d'abord le contenu de mon entry dans une chaine de caractères, puis de convertissais cette chaine. J'avais bien pris soin de declarer cette chaine comme une gchar*, mais non, çà voulais pas marcher, alors j'ai lancé le debbugeur de VC++ une bonne vingtaine de fois pour voir ce qui se passait, bin la conversion marchait, mais le PB, c'est que cette [:aless]  de gchar ne semble pas etre reelement codé en Utf-8. Donc une partie du probème venait de là.
Mais sinon, il ne faut surtout pas renvoyer un pointeur sur une chaine, car cette dernière est détruite, c'et spour çà que j'ai creer une fonction de ce type.
donc les gchar  [:alfinfrance] [:alkap]   :lol:  
bon, maintenant, je trafique mon code avec un paquet de #if defined LINUX ....
pour faire en sorte que mon code soit portable.
J'espère qu'il le sera, mais je sens déjà une grosse couille arriver au niveau du codage des caractères. Sous windows, c'est iso8859-1 mais sous linux, j'en ais pas la moindre idée, et ç àva être sportif à trouver  :lol:  
@++++

Reply

Sujets relatifs:

Leave a Replay

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