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

时间:2014-05-15 06:52:05

标签: c++ unicode char wchar

如果我只在ANSI代码页环境中。

此转化wide charchar

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仅代码页环境中是否仍然保持相同的行为?

2 个答案:

答案 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字符,那么所有的赌注都会被取消。