C / C ++ I18N mbstowcs问题

时间:2010-05-17 23:09:03

标签: c multibyte widechar

我正致力于将C / C ++应用程序的输入国际化。我目前遇到了从多字节字符串转换为宽字符串的问题。

代码需要跨平台兼容,所以我尽可能使用mbstowcs和wcstombs。

我目前正在使用WIN32机器,我已将语言环境设置为非英语语言环境(日语)。

当我尝试转换多字节字符串时,我似乎遇到了一些转换问题。

以下是代码示例:

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;
}

执行结束时,宽字符串不包含转换后的数据。我相信代码页设置存在问题,因为当我使用MultiByteToWideChar并在当前发送代码页时

EX:  的MultiByteToWideChar(                 CP_ACP,                 0,                 mbsVal,                 -1,                 wcsVal,                 大小+ 1             ); 代替mbstowcs调用,转换成功。

我的问题是,如何使用通用mbstowcs调用而不是MuliByteToWideChar调用?

2 个答案:

答案 0 :(得分:1)

调用mbstowcs绝不像Windows上的MultiByteToWideChar那么好。不要费心去解决这个问题,只需坚持使用Win32 API。

答案 1 :(得分:1)

如果您打印setlocale()返回的字符串,您会得到什么?这将指示实际设置的区域设置,可能不是您期望的区域设置。

MSDN indicates在Windows上,为""选择的默认语言环境是“从操作系统获取的用户默认ANSI代码页”。也许这是与当前 ANSI代码页不同的野兽?