libunistring u8_strlen()等于strlen()?

时间:2013-09-26 16:05:02

标签: c unicode utf-8

刚才我正在尝试在我的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);
}

我想知道,这是错误还是正确答案?如果这是正确的,为什么?

2 个答案:

答案 0 :(得分:7)

我认为这是预期的行为。

The libunistring manual说:

  

size_t u8_strlen(const uint8_t * s)

     

返回s中的单位数。

同样在手册中,它定义了这个“单位”是什么:

  

UTF-8字符串,通过'uint8_t *'类型。单位是字节(uint8_t)。

我相信他们标记函数u8_strlen的原因,即使它只执行标准strlen,但该库也有u16_strlenu32_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())相同的答案。