当它具有非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字母它很好用!
答案 0 :(得分:2)
在您的Windows系统code page中,á是单字节字符,即char
中的每个string
确实是一个字符。所以你可以循环并打印它们。
在Linux上,á表示为多字节(准确地说是2个字节)utf-8字符“C3 A1”。这意味着在string
中,á实际上由两个 char
组成,并且分别打印(或以任何方式处理它们)会产生无意义。 ASCII字符永远不会发生这种情况,因为每个ASCII字符的utf-8表示形式都适合单个字节。
不幸的是,C ++标准设施并不真正支持utf-8。只要您只处理整个string
并且既不会从中访问char
,也不会假设string
的长度等于string
中实际字符的数量, std::string
很可能会很好。
如果您需要更多的utf-8支持,请寻找一个能够实现您所需要的良好库。
您可能还想阅读this,了解有关不同系统上不同字符集的更详细讨论以及有关string
与wstring
的建议。
另请查看this以获取有关如何便携地处理不同字符编码的信息。
答案 1 :(得分:1)
尝试使用std :: wstring。据我所知,标准不支持所使用的编码,因此我不会将这些内容保存到没有处理特定格式的库的文件中。某种。它支持多字节字符,因此您可以使用ASCII不支持的字母和符号。
#include <iostream>
#include <string>
int main()
{
std::wstring text = L"áéíóú";
for (int i = 0; i < text.length(); i++)
std::wcout << text[i];
std::wcout << text.length() << std::endl;
}