gpt4 book ai didi

c++ - 使用字符串构造函数从 wstring 转换为字符串时不会丢失数据吗?

转载 作者:行者123 更新时间:2023-11-28 03:04:02 24 4
gpt4 key购买 nike

当我执行以下操作时,我的编译器警告我可能会丢失数据(但编译成功):

std::vector<wchar_t> v1;
v1.push_back(L'a');
std::vector<char> v2(v1.begin(), v1.end());

当我执行以下操作时,我没有收到此类警告,而且据我所知,我过去执行此操作时没有丢失数据:

std::wstring w1;
w1 = L"a";
std::string s1(w1.begin(), w1.end());

第二个代码片段中实际上不会丢失数据吗?如果不是,为什么不呢? basic_string 构造函数中是否有一些东西可以处理其他类型字符的迭代器的可能性?还是迭代器本身有什么特别之处?

最佳答案

举个具体的例子,如果你这样写

std::wstring w1 = L"τ"; // That's a Unicode Greek Small Letter Tau (U+03C4)
std::string s1(w1.begin(), w1.end());

您很可能会得到一个包含字符 0xC4 的字符串,它在 Windows ANSI 和 ISO Latin-1 中都是“Ä”。这可能不是你想要的,虽然它在大多数平台上都能正常工作如果你坚持使用 ASCII,但即使这样也不能保证(例如,如果你的代码在 IBM 大型机上运行,​​你可能发现窄字符串是 EBCDIC,宽字符串可以是任意数量的不寻常编码)。

如果要将宽字符串转换为窄字符串,则需要使用适当的函数来应对涉及字符编码的事实。 C++ 并没有真正提供一种合适的方法来做到这一点;通常,您必须恢复到 C 的 wctombs() 函数,或使用特定于平台的 API。 (有人可能会向您指出 narrow ctype 方面,但这仅意味着任何不能由单个字节表示的字符都将替换为指定的字符;即并不是真正的转换。此外,C++11 支持使用 wstring_convert 在 Unicode 字符串之间进行转换,但这仅适用于 Unicode,并不是每个人都将其用于窄字符和宽字符。)

关于c++ - 使用字符串构造函数从 wstring 转换为字符串时不会丢失数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20125998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com