当字符串具有非 ASCII 字符时,我如何循环遍历字符串中的字母? 这适用于 Windows!
for (int i = 0; i < text.length(); i++)
{
std::cout << text[i]
}
但是在 linux 上,如果我这样做:
std::string text = "á";
std::cout << text.length() << std::endl;
它告诉我字符串“á”的长度为 2,而在 Windows 上它只有 1 但是对于 ASCII 字母,效果很好!
最佳答案
在你的windows系统的code page , á 是一个单字节字符,即 string
中的每个 char
确实是一个字符。所以你可以循环打印它们。
在 Linux 上,á 表示为多字节(准确地说是 2 个字节)utf-8 字符“C3 A1”。这意味着在您的 string
中,á 实际上由 two char
组成,分别打印它们(或以任何方式处理它们)会产生废话。这永远不会发生在 ASCII 字符上,因为每个 ASCII 字符的 utf-8 表示都适合一个字节。
不幸的是,utf-8 并不受 C++ 标准设施的真正支持。只要您只处理整个 string
并且既不从中访问单个 char
也不假设 string
的长度等于实际的数量string
中的字符,std::string
很可能没问题。
如果您需要更多的 utf-8 支持,请寻找一个可以实现您需要的好的库。
您可能还想阅读 this有关不同系统上不同字符集的更详细讨论以及关于 string
与 wstring
的建议。
另请查看 this有关如何可移植地处理不同字符编码的信息。
关于C++ 非 ASCII 字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357380/