2010-05-17 5 views
2

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?

+1

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

+0

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

Répondre

1

Que obtenez-vous si vous imprimez la chaîne renvoyée par setlocale()? Cela indiquera quels paramètres régionaux ont été définis, ce qui peut ne pas être celui que vous attendez.

MSDN indicates que sur Windows, les paramètres régionaux par défaut choisi pour "" est « le code ANSI-utilisateur par défaut la page obtenue à partir du système d'exploitation ». Peut-être est-ce une bête différente à la actuelle page de code ANSI?

1

Appeler mbstowcs n'est jamais une aussi bonne idée que MultiByteToWideChar sous Windows. Ne vous embêtez pas à comprendre cela, il suffit de s'en tenir aux API Win32.

+0

Quelle chose ridicule à dire! Si vous développez sur Windows, bien sûr, utilisez l'API Win32, mais il dit clairement que ce code doit être multi-plateforme et immédiatement ... * BANG * vous avez des problèmes! –

+0

mbstowcs n'est pas générique. la définition de 'w' est complètement variable: parfois UTF-16, parfois UTF-32. Si vous voulez 'générique', utilisez ICU. – bmargulies