代码之家  ›  专栏  ›  技术社区  ›  bogertron

C/C++ I18N-BSTOWCS问题

  •  2
  • bogertron  · 技术社区  · 14 年前

    我正在努力实现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;
    }
    

    在执行结束时,宽字符串不包含转换的数据。我认为代码页设置有问题,因为当我使用multibytoWideChar并将当前代码页发送到

    前任: 多字节towidechar( CPY-ACP, 0, 姆斯瓦尔 - 1, 韦斯瓦尔 尺寸+ 1 ; 代替mbstowcs调用,转换成功。

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   caf    14 年前

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

    MSDN indicates 在Windows上,为 "" “从操作系统获取的用户默认ANSI代码页” . 也许这是一种不同于 现在的 ANSI代码页?

        2
  •  1
  •   bmargulies    14 年前

    调用mbstowcs从来没有Windows上的多字节towidechar好主意。不用费心去弄清楚,只要坚持使用win32 API就行了。

    推荐文章