日语系统上的字符转换不正确

时间:2012-02-13 20:42:22

标签: c++ unicode ansi

我有一个用多字节字符集编译的项目。当msg1包含日文字符时,以下转换失败。

bool MyClass::UnfoldEnvelope(BSTR msg1)
{
    CW2A msg(msg1);
    LPCTSTR p0 = msg;
    ....
}

在输入时,msg1是包含unicode字符的BSTR,并且具有日语的路径名。转换CW2A似乎起作用,在调用之后,msg包含可识别的日语字符串。但是,LPCTSTR分配失败。在行之后,p0包含垃圾。字符串p0随后用于我不愿意接触的旧代码中。

在这种情况下,获取指向字符串“msg”的指针的正确方法是什么?

在英语中一切正常。

1 个答案:

答案 0 :(得分:0)

尝试使用WideCharToMultiByte! CP_ACP将宽字符串传输到当前的Windows语言单字节字符串(在日语Windows上可能是日语,CW2A也是如此)。如果您的Windows不是日语,但是您有日语字符,则应使用CP_UTF8(UTF-8)并在使用时将文本传回UTF-16(wchar_t)(显示,打印或用作文件名)。要转换回来,您应该使用MultiByteToWideChar函数。

只是要说清楚:ANSI多字节代码只是整个Unicode的一个子集。 Windows使用与Windows位置相同的子集(您可以在Control Panel中配置它)。如果您有一个真正的Unicode字符串或不是基于语言环境的字符串,则应该将所有字符保留为Unicode。如果要使用单字节字符串和Unicode,则应将wchar_t字符串(所有Windows宽字符为UTF-16)传输到UTF-8 Unicode字符串。

检查此来源:

bool MyClass::UnfoldEnvelope(BSTR msg1) 
{
    // Get the necessary space for single byte string 
    int new_size = WideCharToMultiByte( CP_UTF8, 0, msg1, -1, NULL, NULL, NULL, NULL );
    if ( new_size <= 0 )
      return false;
    // Use vector to C functions
    vector<char> p0(new_size);
    // Convert the string
    if ( WideCharToMultiByte( CP_UTF8, 0, msg1, -1, &p0[0], new_size, NULL, NULL ) <= 0 )
    {
      return false;
    }
    // use string as a usual single byte string (save, load etc.)
    .... 
    // get the string size in UTF-16
    new_size = MultiByteToWideChar( CP_UTF8, 0, &p0[0], -1, NULL, NULL );
    if ( new_size <= 0 )
      return false;
    // Use vector to C functions
    vector<wchar_t> p1w(new_size);
    // convert back to UTF-16
    if ( MultiByteToWideChar( CP_UTF8, 0, &p0[0], -1, &p1w[0], new_size ) <= 0 )
      return false;
    ...
    // use your Unicode string as a file name
    return ( CopyFileW( L"old_file", &p1w[0], TRUE ) != FALSE );
}