在C中获取UTF-8的字符串长度? [已关闭]

问题描述 投票:0回答:1

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

只要用户通过 scanf 输入的字符串的当前元素不是 ,就将“length”int 加一,然后打印出长度。

如果有人能指导我通过尽可能最简单的方式,我将非常感激,因为我是初学者。

c string utf-8
1个回答
19
投票

字符串长度是什么意思?

UTF-8 编码设计得非常好,并且与 C 字符串的定义兼容,UTF-8 字符串只是以 null 结尾的字节数组,就像 ASCII 字符串一样。

使用

strlen(s)
可以轻松获得字节数。如果由于某种原因你不能使用
strlen
,它很容易模拟,并且算法正是你在问题中提出的:

size_t string_lengh(const char *s) {
    size_t length = 0;
    while (*s++ != '\0')
        length++;
    return length;
}

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

'\0'

这是一个简单的函数来执行此操作:

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

此函数假设

s
指向的数组的内容已正确编码。

另请注意,这将计算代码点的数量,而不是显示的字符数,因为其中一些可能使用多个组合代码点进行编码,例如

<LATIN CAPITAL LETTER A>
后跟
<COMBINING ACUTE ACCENT>

© www.soinside.com 2019 - 2024. All rights reserved.