gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:00:55 25 4
gpt4 key购买 nike

我使用了这个函数的一个稍微修改过的版本 is_utf8 https://stackoverflow.com/a/1031773/275677从字符数组中提取 UTF8 序列,返回序列及其中的字节数,以便我可以用这种方式遍历字符串。

不过,我现在想向后迭代字符串 (char *)。执行此操作的最佳方法是什么?


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

但是,utf8 有歧义吗?例如,aaaabb 是否可以解析为 aaaa.bb 也可以(向后)解析为 aa.aabb 其中 aaaaaabbaabb 是有效的 utf8 序列吗?

最佳答案

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

  • EITHER 恰好由一个八位字节(字节给你和我)组成,最高位清除

  • 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;
}

关于c - 通过 utf8 多字节字符串向后迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22257486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com