C/C++;I18N MBCS问题

C/C++;I18N MBCS问题,c,multibyte,widechar,C,Multibyte,Widechar,我正在为C/C++应用程序国际化输入。我目前遇到了从多字节字符串转换为宽字符串的问题 代码需要跨平台兼容,因此我尽可能多地使用mbstowcs和wcstombs 我目前在WIN32机器上工作,我已将语言环境设置为非英语语言环境(日语) 当我试图转换一个多字节字符串时,我似乎遇到了一些转换问题 下面是一个代码示例: int main(int argc, char** argv) { wchar_t *wcsVal = NULL; char *mbsVal = NULL;

我正在为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并发送当前代码页时

例: 多字节tetowidechar( CP_机场核心计划, 0, 姆布斯瓦尔, -1, wcsVal, 尺寸+1 ); 转换成功,取代了mbstowcs调用


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

在Windows上调用mbstowcs从来没有像MultiByteToWideChar那样好。不必费心弄明白,只需使用Win32 API。

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


在Windows上,为“
”选择的默认区域设置是“从操作系统获得的用户默认ANSI代码页”。这可能与当前ANSI代码页不同?

如果打印由
setlocale()返回的字符串,您会得到什么?这将指示实际设置的区域设置。SMACK!(前额)“英语美国1252”。我认为我已经设置了不同的系统区域设置。这解释了很多。虽然我认为当我检索代码页时,它会反映语言环境是什么。如果你提出了一些答案,如果不接受的话,至少要考虑一下,这是多么荒谬的事情啊!如果你是在Windows上开发,当然一定要使用Win32 api,但他明确地说,这段代码必须是跨平台的,并且立即。。。砰,你有麻烦了!mbstowcs不是通用的。“w”的定义是完全可变的:有时是UTF-16,有时是UTF-32。如果您想要“通用”,请使用ICU。