我正在编写一个程序,我将一串希腊字符作为输入,当我打印它的len时,它会输出它的double。例如,如果ch =“AΒ”(希腊字符)或ch =“αβ”,则
printf("%d",strlen(ch));
输出4而不是2.如果ch =“ab”,则输出2.发生了什么?
答案 0 :(得分:1)
您可以使用mbstowcs()函数将multybite字符串转换为宽字符串。然后使用wcslen()来确定它的长度。
答案 1 :(得分:1)
可能是因为您的字符串是使用可变宽度字符编码进行编码的。
在过去的好时光中,我们只打了128个不同的角色:a-z,A-Z,0-9,以及一些逗号,括号和控件。一切都以7位处理,我们称之为ASCII。然后这还不够,我们添加了一些其他的东西,比如顶部带有线条或点的字母,我们去了8位(1字节),可以在一个字节中执行任意256个字符。 (尽管人们对这些额外128个插槽中应该包含的内容的看法各不相同,基于他们语言中最有用的内容 - 请参阅usr2564301的评论 - 然后您必须说明您使用的版本应该用于那些额外插槽中的内容。)
如果你的字符串中有2个字符,那么它总是2字节长(或许加上一个空终结符)。
但是后来人们意识到英语不是世界上唯一的语言,实际上全世界有数百种语言的数千种语言。现在该怎么办?
嗯,我们可以说只有大约65,000个字符让我们感兴趣,并将所有字母编码为两个字节。有一些编码格式可以做到这一点。一个双字母的字符串将始终是4个字节(嗯,可能在前面有一些字节顺序标记,最后可能是一个空终止符)。两个问题:a)不是非常向后兼容ASCII,和b)浪费字节,如果大多数文本都是好的'ASCII字符集中的东西。
单步执行UTF-8,我将下注你的字符串用于编码或类似的东西。 ASCII字符,如'a'和'b',用一个字节编码,更奇特的字符(从英语角度来看--blush--占用多个字节,其中第一个字节是说“以下内容将与此字节一起表示一个字母”。所以你得到可变宽度编码。因此,两个字母的字符串的长度至少为两个字节,但如果它包含非ASCII字符,则会更多。