刚才我试图在我的c程序中使用libunistring。我必须处理UTF-8字符串,为此,我使用了libunistring库中的u8_strlen()函数。
代码示例:
void print_length(uint8_t *msg) {
printf("Default strlen: %d\n", strlen((char *)msg));
printf("U8 strlen: %d\n", u8_strlen(msg));
}假设我们用print_length() (cyrillic,utf-8编码)来调用msg = "привет"。我预计strlen()应该返回12个字母(每个字母返回6个字母*2个字节),而u8_strlen()应该返回6个字母(仅6个字母)。
但我得到了奇怪的结果:
Default strlen: 12
U8 strlen: 12在此之后,我尝试查找u8_strlen实现,并发现了以下代码:
size_t
u8_strlen (const uint8_t *s)
{
return strlen ((const char *) s);
}我在想,是错误的还是正确的答案?如果是对的,为什么?
发布于 2013-09-26 16:25:47
我相信这就是我想要的。
libunistring手册说:
size_t u8_strlen (const uint8_t *s) 返回s中的单位数。
在手册中,它还界定了这个“单位”是什么:
通过‘uint8_t*’类型的UTF-8字符串。单位是字节(uint8_t)。
我相信他们给函数u8_strlen贴上标签的原因--尽管它只做了标准的strlen --是因为库中还有u16_strlen和u32_strlen,分别用于对UTF-16和UTF-32字符串进行操作(这将计算到0x0000之前的2字节单元的数量,以及直到0x00000000的4字节单元的数量),而且它们只包含了u8_strlen的完整性。
然而,GNU gnulib确实包括了mbslen,它可能做您想做的事情:
mbslen函数:确定字符串中的多字节字符数。
发布于 2013-09-26 18:35:55
除了Berry的答案之外,我还注意到C标准允许一个字符中有8位以上。然后strlen()将以char为单位返回长度,而不是以8位块返回,因此是u8_strlen()返回值的一小部分(或者应该返回--您所展示的实现显然不起作用,并给出了与strlen()相同的答案)。
https://stackoverflow.com/questions/19033215
复制相似问题