【问题标题】:C/C++ I18N mbstowcs questionC/C++ I18N mbstowcs 问题
【发布时间】:2011-02-20 15:58:28
【问题描述】:

我正在致力于国际化 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 并发送当前代码页时

前: MultiByteToWideChar( CP_ACP, 0, mbsVal, -1, wcsVal, 尺寸 + 1 ); 代替 mbstowcs 调用,转换成功。

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

【问题讨论】:

  • 如果打印setlocale()返回的字符串会得到什么?这将指示实际设置的区域设置。
  • SMACK! (额头)“English_United States.1252”。我以为我设置了不同的系统区域设置。这解释了很多。虽然我认为当我检索代码页时它会反映语言环境是什么。如果您提交了某种答案,如果不被接受,至少认为它是赞成的。

标签: c multibyte widechar


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 Windows 上调用 mbstowcs 从来没有像 MultiByteToWideChar 那样好。不用费心去搞清楚,只要坚持使用 Win32 API。

    【讨论】:

    • 这话多可笑!如果你在 Windows 上开发,一定要使用 Win32 api,但他明确表示这段代码必须是跨平台的,并且立即...... BANG 你有麻烦了!
    • mbstowcs 不是通用的。 'w' 的定义是完全可变的:有时是 UTF-16,有时是 UTF-32。如果您想要“通用”,请使用 ICU。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多