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

wes*_*erg 1 c++ iterator utf-8

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

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

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

Mar*_*som 5

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

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

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

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