C ++非ASCII字母

时间:2015-07-11 12:52:55

标签: c++ c++11 visual-c++

当它具有非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字母它很好用!

2 个答案:

答案 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,了解有关不同系统上不同字符集的更详细讨论以及有关stringwstring的建议。

另请查看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;
}