0

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

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

4

2 回答 2

4

没有像 ANSI 代码页环境这样的东西。有几十个。

您的两个“快捷方式”转换在所有这些转换中都不正确。

ASCII字符到 UTF-16的转换wchar_t可以使用您的最后一种方法,但是对于大多数 ANSI 代码页的后半部分,这将失败。它最适用于西欧代码页,其中只有 32 个字符错误。例如。欧元符号€总是会被错误转换。

于 2014-05-15T10:06:15.963 回答
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()使用该 PC 上引用的代码页执行从 UTF-16 到 ANSI 的真正转换CP_ACP(根据用户区域设置,每台 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()使用代码页执行从 ANSI 到 UTF-16 的真正转换CP_ACP,而std::wstring(begin, end)只是将源元素类型转换为根本wchar_t没有任何转换。

仅当源字符串使用范围内的 ASCII 字符时,类型转换才等效0x00-0x7F于 API 转换。但如果他们使用的是非 ASCII 字符,那么所有的赌注都会被取消。

于 2014-05-16T01:26:38.767 回答