刚才我正在尝试在我的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));
}
Run Code Online (Sandbox Code Playgroud)
试想一下我们print_length()用msg = "??????"(西里尔文,utf-8编码)调用.我预计strlen()应该返回12(每个字母6个字母*2个字节),并且
u8_strlen()应该返回6个(只有6个字母).
但我收到了好奇的结果:
Default strlen: 12
U8 strlen: 12
Run Code Online (Sandbox Code Playgroud)
在此之后我试图查找u8_strlen实现,并找到了这段代码:
size_t
u8_strlen (const uint8_t *s)
{
return strlen ((const char *) s);
}
Run Code Online (Sandbox Code Playgroud)
我想知道,这是错误还是正确答案?如果这是正确的,为什么?
我相信这是预期的行为.
size_t u8_strlen(const uint8_t*s)
返回s中的单位数.
同样在手册中,它定义了这个"单位"是什么:
UTF-8字符串,通过'uint8_t*'类型.单位是字节(uint8_t).
我相信他们标记该功能的原因,u8_strlen即使它只做标准strlen,该库也分别对UTF-16和UTF-32字符串进行操作u16_strlen和u32_strlen操作(这将计算直到0x0000的2字节单位数)和4字节单位,直到0x00000000),它们u8_strlen仅包括完整性.
然而mbslen,GNU gnulib确实包含了你想做的事情:
mbslen function:确定字符串中多字节字符的数量.
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |