首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libunistring u8_strlen()等于strlen()?

libunistring u8_strlen()等于strlen()?
EN

Stack Overflow用户
提问于 2013-09-26 16:05:02
回答 2查看 864关注 0票数 5

刚才我试图在我的c程序中使用libunistring。我必须处理UTF-8字符串,为此,我使用了libunistring库中的u8_strlen()函数。

代码示例:

代码语言:javascript
复制
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个字母)。

但我得到了奇怪的结果:

代码语言:javascript
复制
Default strlen: 12
U8 strlen: 12

在此之后,我尝试查找u8_strlen实现,并发现了以下代码:

代码语言:javascript
复制
size_t
u8_strlen (const uint8_t *s)
{
    return strlen ((const char *) s);
}

我在想,是错误的还是正确的答案?如果是对的,为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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_strlenu32_strlen,分别用于对UTF-16和UTF-32字符串进行操作(这将计算到0x0000之前的2字节单元的数量,以及直到0x00000000的4字节单元的数量),而且它们只包含了u8_strlen的完整性。

然而,GNU gnulib确实包括了mbslen,它可能做您想做的事情:

mbslen函数:确定字符串中的多字节字符数。

票数 7
EN

Stack Overflow用户

发布于 2013-09-26 18:35:55

除了Berry的答案之外,我还注意到C标准允许一个字符中有8位以上。然后strlen()将以char为单位返回长度,而不是以8位块返回,因此是u8_strlen()返回值的一小部分(或者应该返回--您所展示的实现显然不起作用,并给出了与strlen()相同的答案)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19033215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档