C++ 非 ASCII 字母

标签 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 字母,效果很好!

最佳答案

在你的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有关不同系统上不同字符集的更详细讨论以及关于 stringwstring 的建议。

另请查看 this有关如何可移植地处理不同字符编码的信息。

关于C++ 非 ASCII 字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357380/

相关文章:

c++ - Winsock2:如何通过在 VC++ 中使用 listen 的积压一次只允许一个客户端连接

c++ - 如何在 C++ 中检查 Microsoft Outlook 是否打开?

visual-c++ - MSVC 中的 "Escape"和 "Clobber"等效

c++ - 在 C++ 中,如果按下回车键,我如何制作 cin "cancel"?

C++::重载运算符*用于矩阵- vector 乘法

c++ - 具有自动默认和移动构造函数的不可复制类

c++ - 有什么方法可以使用类的成员函数在并发线程中运行而无需在 C++11 中传递 *this 吗?

c++11 - 通过引用传递从索引 i 开始的向量

c++ - 使用#define 管理代码

c++ - 在 C++ 中禁用隐式 this