刚才我正在尝试在我的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()
(西里尔文,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);
}
我想知道,这是错误还是正确答案?如果这是正确的,为什么?
答案 0 :(得分:7)
我认为这是预期的行为。
size_t u8_strlen(const uint8_t * s)
返回s中的单位数。
同样在手册中,它定义了这个“单位”是什么:
UTF-8字符串,通过'uint8_t *'类型。单位是字节(uint8_t)。
我相信他们标记函数u8_strlen
的原因,即使它只执行标准strlen
,但该库也有u16_strlen
和u32_strlen
用于操作UTF-16和UTF-32字符串分别(直到0x0000计算2字节单位的数量,直到0x00000000计算4字节单位),它们仅包括u8_strlen
完整性。
GNU gnulib包括mbslen
可能会做你想要的事情:
mbslen function:确定字符串中多字节字符的数量。
答案 1 :(得分:0)
除了Berry的回答之外,我还注意到C标准允许在char中有超过8位。然后strlen()
将返回char的长度,而不是8位块中的长度,因此将是u8_strlen()
返回(或应该返回)的一小部分 - 您显示的实现显然不起作用并给出与strlen()
)相同的答案。