在C中获取UTF-8的字符串长度?

Dae*_*eto -1 c string utf-8

可以使用与此类似的方法完成此操作:

只要用户通过scanf输入的字符串的当前元素不是\ 0,将一个添加到"length"int,然后打印出长度.

如果有人能够以最简单的方式指导我,我会非常感激,因为我是初学者.

非常感谢,有一个好的!

chq*_*lie 6

字符串长度是什么意思?

用字符很容易获得字节数strlen(s).

以UTF-8编码的代码点数可以通过计算单字节字符数(范围1到127)和前导字节数(范围0xC0到0xFF)来计算,忽略连续字节(范围0x80到0xBF)和停在'\0'.

这是一个简单的功能:

size_t count_utf8_code_points(const char *s) {
    size_t count = 0;
    while (*s) {
        count += (*s++ & 0xC0) != 0x80;
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

此函数假定指向的数组的内容s已正确编码.

还要注意,这将计算代码点的数量,而不是显示的字符数,因为其中一些可以使用多个组合代码点进行编码,例如<LATIN CAPITAL LETTER A>后面跟着<COMBINING ACUTE ACCENT>.