C++ 非 ASCII 字母

C++ Non ASCII letters

我如何遍历非 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 中,á 实际上由 两个 char 组成,分别打印它们(或以任何方式处理它们)会产生无意义的结果。这永远不会发生在 ASCII 字符上,因为每个 ASCII 字符的 utf-8 表示都适合一个字节。

不幸的是,utf-8 并不受 C++ 标准设施的真正支持。只要您只处理整个 string,既不从中访问单个 char,也不假定 string 的长度等于 string 中的实际字符数, std::string 很可能会很好。

如果您需要更多的 utf-8 支持,请寻找一个可以实现您需要的好的库。

您可能还想阅读 this 以获得关于不同系统上不同字符集的更详细讨论以及关于 stringwstring 的建议。

另请参阅 this 以获取有关如何可移植地处理不同字符编码的信息。

尝试使用 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;
}