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

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;
&#125;
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
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.

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&#40;wc&#41;;
char c&#91;MAXISOCHAR&#93;;
memset&#40;c,0,MAXISOCHAR&#41;;
iRet=WideCharToMultiByte&#40;
			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
			&#41;;
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)

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