Je travaille sur l'internationalisation de l'entrée pour une application C/C++. J'ai actuellement rencontré un problème avec la conversion d'une chaîne de plusieurs octets en chaîne de caractères large. Le code doit être compatible avec toutes les plates-formes. J'utilise mbstowcs et wcstombs autant que possible.C/C++ I18N mbstowcs question
Je travaille actuellement sur une machine WIN32 et j'ai défini les paramètres régionaux sur une langue autre que l'anglais (japonais).
Lorsque j'essaie de convertir une chaîne de caractères multi-octets, il semble y avoir des problèmes de conversion.
Voici un exemple du code:
int main(int argc, char** argv)
{
wchar_t *wcsVal = NULL;
char *mbsVal = NULL;
/* Get the current code page, in my case 932, runs only on windows */
TCHAR szCodePage[10];
int cch= GetLocaleInfo(
GetSystemDefaultLCID(),
LOCALE_IDEFAULTANSICODEPAGE,
szCodePage,
sizeof(szCodePage));
/* verify locale is set */
if (setlocale(LC_CTYPE, "") == 0)
{
fprintf(stderr, "Failed to set locale\n");
return 1;
}
mbsVal = argv[1];
/* validate multibyte string and convert to wide character */
int size = mbstowcs(NULL, mbsVal, 0);
if (size == -1)
{
printf("Invalid multibyte\n");
return 1;
}
wcsVal = (wchar_t*) malloc(sizeof(wchar_t) * (size + 1));
if (wcsVal == NULL)
{
printf("memory issue \n");
return 1;
}
mbstowcs(wcsVal, szVal, size + 1);
wprintf(L"%ls \n", wcsVal);
return 0;
}
A la fin de l'exécution, la chaîne de caractères large ne contient pas les données converties. Je crois qu'il ya un problème avec les paramètres de la page de code, parce que quand j'utiliser MultiByteToWideChar et que la page de code actuel envoyé dans
EX: MultiByteToWideChar ( CP_ACP, 0, mbsVal, -1, wcsVal , taille + 1 ); à la place des appels mbstowcs, la conversion réussit.
Ma question est, comment puis-je utiliser l'appel mbstowcs générique au lieu de l'appel MuliByteToWideChar?
Qu'est-ce que vous obtenez si vous imprimez la chaîne renvoyée par 'setlocale()'? Cela indiquera quel paramètre local a été défini. – caf
SMACK! (front) "English_United States.1252". Je pensais que j'avais défini les paramètres régionaux du système différemment. Cela explique beaucoup. Bien que je pensais que lorsque j'ai récupéré la page de code, cela refléterait ce que les paramètres régionaux étaient. Si vous soumettez une sorte de réponse, considérez-la au moins upvoted si elle n'est pas acceptée. – bogertron