ANSI代码页中wchar_t char之间的转换



如果我在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());

charwide 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字符,那么所有的赌注都是无效的。

最新更新