通过utf8多字节字符串向后迭代

Hob*_*Ben 8 c string iteration utf-8

我使用这个函数的略微修改版本is_utf8 /sf/answers/72224141/从字符数组中提取UTF8序列,返回序列及其中的字节数,以便我可以在此处迭代字符串办法.

但是我现在想要在字符串()上向后迭代char *.做这个的最好方式是什么?


我的猜测是尝试将字符串的最后四个,三个,两个和一个字节分类为utf8(四次)并选择最长的字节.

但是,utf8是否具有暧昧的情况?例如可以aaaabb解析为aaaa.bb也可以(向后)解析为aa.aabb其中aa,aaaa,bbaabb是有效的UTF8序列?

abl*_*igh 13

字符串由一系列UTF-8序列组成.所有UTF-8序列:

  • 它只包含一个八位字节(你和我的字节),顶部位清晰

  • OR由一个八位字节组成,其中两个最高位设置,然后是一个或多个八位字节,第7位设置,第6位清除.

有关详细信息,请参见http://en.wikipedia.org/wiki/Utf8#Description.

所以你需要做的是检查相关字符是否有第7位和第6位清除,如果是这样,请退一步,注意不要超出字符串的开头(请注意,如果字符串格式正确,这不会发生).

未经测试的C-ish伪代码:

char *
findPrevious (const char *ptr, const char *start)
{
    do
    {
        if (ptr <= start)
            return NULL; /* we're already at the start of the string */
        ptr--;
    } while ((*ptr & 0xC0) == 0x80);
    return ptr;
} 
Run Code Online (Sandbox Code Playgroud)