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

在C中获取UTF-8上的字符串长度?,c,string,utf-8,C,String,Utf 8,是否可以使用类似于此的方法进行此操作: 只要用户通过scanf输入的字符串的当前元素不是\0,请在长度int中添加一个元素,然后打印出长度 如果有人能以最简单的方式引导我,我将不胜感激,因为我是一名初学者 非常感谢你,祝你过得愉快 你所说的字符串长度是什么意思 UTF-8编码设计得非常好,并且与C字符串的定义兼容,UTF-8字符串只是以null结尾的字节数组,就像ASCII字符串一样 使用strlens很容易获得字节数。如果出于某种原因,您无法使用strlen,那么很容易进行仿真,并且算法正是您

是否可以使用类似于此的方法进行此操作:

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

如果有人能以最简单的方式引导我,我将不胜感激,因为我是一名初学者

非常感谢你,祝你过得愉快

你所说的字符串长度是什么意思

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

使用strlens很容易获得字节数。如果出于某种原因,您无法使用strlen,那么很容易进行仿真,并且算法正是您在问题中提出的:

size_t string_lengh(const char *s) {
    size_t length = 0;
    while (*s++ != '\0')
        length++;
    return length;
}
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;
}
此函数假定s指向的数组的内容已正确编码


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

mblen/mbrlen以查找每个字符的长度,然后编写自己的函数,在字符串上迭代,直到终止符,添加字符长度?您的方法将返回字节数,就像任何以零结尾的字符串一样。不过,听起来您需要的是字符数。无论哪种方式,这都是一个常见问题,应该很容易找到一个满足您的要求的副本,并解释您正在掩盖的复杂性。正确的可能副本,除了您的范围应该是0xC2到0xF4,否则存在无效的UTF-8序列,因为在U+10FFFF F4 8F BF之外没有代码点,和0xC1和0xC0都表示,这是无效的。@ChronoKitsune:如上所述,函数不尝试检查正确的编码。如果字符串编码正确,函数将返回正确数量的代码点。如果不是,您建议的更改将无法提供完整的字符串验证:计算连续字节数、检查超长序列和无效代码点将需要更多的代码。我想如果您能够信任输入数据,事实上,您的代码已经足够好了,不会因为验证而减慢任何速度。我考虑的是字符串中的字符数减去\0。如果没有strlen功能,它是否可行?为什么不能使用strlen?strlen的重新实现非常简单:size_t strlenconst char*s{const char*a=s;while*s++;返回s-a;}