c++ - 如何遍历字符串中的所有 utf-8 代码点

标签 c++ utf-8 iterator

<分区>

我希望能够遍历字符串中的所有 utf-8 字符。

假设所有代码点都有一个索引,第一个代码点的索引为 0,最后一个代码点的索引为 N。我希望迭代器能够向前跳转 X 个索引,并告诉我一个代码点的索引.

我想做类似于 http://www.nubaria.com/en/blog/?p=371 的事情,但我不确定如何迭代字节,以便迭代器始终引用合法 utf-8 代码点的开头。

最佳答案

警告:此方法仅在您已经知道您的字节包含干净的 UTF-8 时才有效。如果存在格式错误或无效的字符,它将无法正常工作。

UTF-8 编码代码点的第二个到最后一个字节的位序列始终为 10xxxxxx。跳过这些,您将进入下一个代码点的开头。

for (int i=0; i<X && *p!=0; ++i)
{
    ++p;
    while ((*p & 0xc0) == 0x80) ++p;
}

*p!=0 是为了确保您不会越过字符串的末尾。

关于c++ - 如何遍历字符串中的所有 utf-8 代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473209/

相关文章:

python - 为什么我的图片在用python下载并写入后损坏了?

python - 在 XML 标签/文本中使用特殊字符

C++ BOOST ForEach 与自定义宏

c++ - 如何找出WSD打印机的IP地址?我想使用 WSD API,但无法使用 IWSDDiscoveredDevice

c++ - 是否有整洁的等价物来查看成员函数/变量?

c++ - 为什么非常量静态变量需要在类外初始化?

python - 最后获得带有附加项的成对迭代器

c++ - 具有可变成员的 constexpr 对象

powershell - 使用 PowerShell 正确读取 UTF-8 文件

c++ - 为什么 std::istream_iterator 构造函数返回指针