日语系统中的字符转换不正确
Incorrect character conversion on Japanese systems
我有一个使用多字节字符集编译的项目。当消息1包含日语字符时,以下转换失败。
bool MyClass::UnfoldEnvelope(BSTR msg1)
{
CW2A msg(msg1);
LPCTSTR p0 = msg;
....
}
在输入时,msg1是一个BSTR,它包含unicode字符,并且有一个日语路径名。转换CW2A似乎在调用后工作,msg包含可识别的日语字符串。但是,LPCTSTR分配失败。在行之后,p0包含垃圾。字符串p0随后在我不愿意接触的旧代码中使用。
在这种情况下,获取指向字符串"msg"的指针的正确方法是什么?
在英语中一切都很好。
尝试使用WideCharToMultiByte
!CP_ACP将宽字符串转换为当前Windows语言的单字节字符串(在日语Windows上可以是日语,CW2A也可以)。如果您的Windows不是日语,但有日语字符,则应使用CP_UTF8(UTF-8),并在使用(显示、打印或用作文件名)时将文本传输回UTF-16(wchar_t)。要转换回,您应该使用MultiByteToWideChar
函数。
明确一点:ANSI多字节代码只是整个Unicode的一个子集。Windows使用与您的Windows位置相同的子集(您可以在"控制面板"中进行配置)。如果您有一个真正的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 );
}
相关文章:
- 为什么要 boost::p roperty_tree::write_json() 将整数值转换为字符串?这是不正确的
- AIX编译器13.1.3对c++进行了不正确的双重转换
- 对从引用到 std::reference_wrapper 或编译器错误的隐式转换的理解不正确?
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- 将函数的地址转换为UINTPTR_T给我不正确的结果
- 使用 iconv 进行 UTF8 转换的输出不正确
- 将uint8_t转换为已签名的 int 是否至少有时不正确?
- 更改CV_32FC1以CV_64FC1导致不正确的数据转换
- time_t提高日期转换,给出不正确的结果
- 我创建了一个将雷亚尔转换为美元的程序,但浮点变量不正确
- 为什么隐式类型转换在此代码中结果不正确
- 由于转换错误而导致的过载/专业不正确
- Base64 转换器的输出不正确
- 静态强制转换为不正确的类型
- C++中int到字符串的转换不正确
- 日语系统中的字符转换不正确
- 双到长转换不正确
- OPOS BSTR*转换不正确
- 类构造函数中的类型转换不正确
- 极坐标-笛卡尔坐标转换不正确.-0是什么意思