如果我在ANSI代码页环境中。
是否将wide char
转换为char
:
char ansi_cstr[size_of_ansi_str];
WideCharToMultiByte(CP_ACP, 0, ansi_wstr.c_str(), -1, ansi_str, size_of_ansi_str, 0, 0);
std::string ansi_str = std::string(ansi_cstr);
等于后面的
std::string ansi_str = std::string(ansi_wstr.begin(), ansi_wstr.end());
和char
到wide char
wchar_t ansi_wcstr[size_of_ansi_str];
MultiByteToWideChar(CP_ACP, 0, ansi_str.c_str(), -1, ansi_wcstr, size_of_ansi_str);
std::wstring ansi_wstr = std::wstring(ansi_wcstr);
等于
std::wstring ansi_wstr = std::wstring(ansi_str.begin(), ansi_str.end());
这两种情况在ansi代码页环境中保持相同的行为吗?
没有这种 ANSI代码页环境。有几十个。
你的两个"快捷方式"转换都不正确。
从ASCII char到UTF-16 wchar_t
的转换将与您的最后一种方法一起工作,但这对于大多数ANSI代码页的后半部分不起作用。它在西欧代码页上工作得最好,只有32个字符出错。例如。
WideCharToMultiByte(CP_ACP, 0, ansi_wstr.c_str(), -1, ansi_str, size_of_ansi_str, 0,0);
与不相同
std::string ansi_str = std::string(ansi_wstr.begin(), ansi_wstr.end());
WideCharToMultiByte()
使用CP_ACP
在该PC上引用的代码页执行从UTF-16到ANSI的真正转换(根据用户区域设置,每个PC上的代码页可能不同)。std::string(begin, end)
只是循环遍历源容器,将每个元素类型强制转换为char
,根本不执行任何代码页转换。
:
MultiByteToWideChar(CP_ACP, 0, ansi_str.c_str(), -1, ansi_wcstr, size_of_ansi_str);
与不相同
std::wstring ansi_wstr = std::wstring(ansi_str.begin(), ansi_str.end());
出于同样的原因。MultiByteToWideChar()
使用CP_ACP
代码页执行从ANSI到UTF-16的真正转换,而std::wstring(begin, end)
只是将源元素类型强制转换为wchar_t
,根本没有任何转换。
0x00-0x7F
范围内的ASCII字符时,类型转换才会等同于API转换。但是如果他们使用非ascii字符,那么所有的赌注都是无效的。