我有一个用多字节字符集编译的项目。当msg1包含日文字符时,以下转换失败。
bool MyClass::UnfoldEnvelope(BSTR msg1)
{
CW2A msg(msg1);
LPCTSTR p0 = msg;
....
}
在输入时,msg1是包含unicode字符的BSTR,并且具有日语的路径名。转换CW2A似乎起作用,在调用之后,msg包含可识别的日语字符串。但是,LPCTSTR分配失败。在行之后,p0包含垃圾。字符串p0随后用于我不愿意接触的旧代码中。
在这种情况下,获取指向字符串“msg”的指针的正确方法是什么?
在英语中一切正常。
答案 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 );
}