gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:40 26 4
gpt4 key购买 nike

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

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 位置相同的子集(您可以在 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 );
}

关于c++ - 日语系统上的字符转换不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9267705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com