Bonjours a tous.
Voila mon problème je dois convertir de l'UTF8 dans des vieux types d'encodage 8 bits pour des problèmes de compactibilité. Je suis bien conscient que ça va pas marcher pour tout le temps car certains points de code Unicode n'auront pas leur équivalent mais dans mon cas precis je reste un peu perplexe. Donc si quelqu'un a une idée de ce que je fais mal, ça serait vraiment génial.
Voici l’exemple :
J’ai des data UTF8 :
Ex : csUTF8= rollin’
equivalent hex : 72 6f 6c 6c 6e c2 92 (le dernier caractère est code sur 2 octets)
Pour convertir tous ca dans mon type d’encodage en c++ je dois
Convertir le UTF8 en WIDECHAR micro daube code sur deux octets
Donne: rollin% (%caractere qui ne s’affiche pas dans le debugger) equivalent hex : 00 72 00 6f 00 6c 00 6c 00 6e 00 92
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int iRet= MultiByteToWideChar( CP_UTF8, // code page 0, // character-type options csUTF8, // string to map lenUTF8, // number of bytes in string wc, // wide-character buffer MAXWIDECHAR-1 // size of buffer ); if (!iRet){ DWORD a=GetLastError(); … cout << “ARRRR” << endl; return NULL; }
Ce qui semble tres bien car si reconvertis le wide char en UTF8 avec WideCharToMultiByte il retrouve le bon code. 00 92 est donc bien l’équivalent WC du caractère UTF8 C2 92. Cool
Reste à convertir le WC dans ma page de code en l’occurrence le 1252 qui est le standard Windows pour les langues de l’Europe de l’ouest.
Et je me retrouve avec rollin? equivalent hex 72 6f 6c 6c 69 6e 2c 3f (point d’interrogation, la fonction WideCharToMultiByte n’as donc pas réussi a trouver l’équivalent)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int lenWC = wcslen(wc); char c[MAXISOCHAR]; memset(c,0,MAXISOCHAR); iRet=WideCharToMultiByte( 1252, // code page- 0, // performance and mapping flags wc, // wide-character string lenWC, // number of chars in string c, // buffer for new string MAXISOCHAR-1, // size of buffer NULL,// NULL, // default for unmappable chars NULL // set when default char used );
Hors je suis sur ou quasi sur (cf. http://www.miakinen.net/vrac/charsets/) que ce caractère existe dans la page de code 1252.
Le seul truc que je vois est que le ISO 1252 n’est pas installé sur ma machine. Mais bien que je travail sur un Windows XP professionnelle anglais je serais surpris que cette page standard ne soit pas installe (en fait je sais pas vraiment comment vérifier d’ailleurs). Ou alors il faut que je précise quelques choses au niveau du compilateur ou un truc comme ça. Ou alors j’ai tout faux depuis le début ce qui n’est pas a impossible me connaissant
Quelqu’un pour m’aider ou au moins m’expliquer ou je me gourre.
Merci d’avance.
ecuyer
Partager