如果我只在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仅代码页环境中是否仍然保持相同的行为?
答案 0 :(得分:4)
没有 ANSI代码页环境。有几十个。
你的两个"捷径"所有转换都不正确。
从 ASCII char转换为UTF-16 wchar_t
将适用于您的上一个方法,但是大多数ANSI代码页的后半部分都会失败。它最适用于西欧代码页,它只有32个字符错误。例如。欧元符号将始终被错误转换。
答案 1 :(得分:1)
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上引用的代码页(根据用户区域设置在每台PC上可能不同)执行从UTF-16到ANSI的实际转换。 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
,而不进行任何转换。< / p>
仅当源字符串使用0x00-0x7F
范围内的ASCII字符时,类型转换才会等于到API转换。但是如果他们使用的是非ASCII字符,那么所有的赌注都会被取消。