C 希腊字符串的长度大于其应有长度

C 希腊字符串的长度大于其应有长度,c,string,char,C,String,Char,我正在写一个程序,我把一串希腊字符作为输入,当我打印它的len时,它输出它的double。例如,如果ch=“ΑΒ”(希腊字符)或ch=“αβ” printf(“%d”,strlen(ch))输出4而不是2。如果ch=“ab”,则输出2。发生了什么?您可以使用mbstowcs()函数将多比特字符串转换为宽字符串。然后使用wcslen()确定它的长度。可能是因为您的字符串使用可变宽度字符编码 在过去的好日子里,我们只需要处理128个不同的字符:a-z、a-z、0-9,还有一些逗号和括号,并控制一些东

我正在写一个程序,我把一串希腊字符作为输入,当我打印它的len时,它输出它的double。例如,如果ch=“ΑΒ”(希腊字符)或ch=“αβ”


printf(“%d”,strlen(ch))输出4而不是2。如果ch=“ab”,则输出2。发生了什么?

您可以使用mbstowcs()函数将多比特字符串转换为宽字符串。然后使用wcslen()确定它的长度。

可能是因为您的字符串使用可变宽度字符编码

在过去的好日子里,我们只需要处理128个不同的字符:a-z、a-z、0-9,还有一些逗号和括号,并控制一些东西。所有的东西都用7位处理,我们称之为ASCII。然后这还不够,我们添加了一些其他的东西,比如上面有线或点的字母,我们使用8位(1字节),一个字节可以处理256个字符中的任意一个。(尽管人们对于在额外的128个插槽中应该放什么的想法差异很大,这取决于他们的语言中最有用的内容——参见usr2564301的评论——然后你必须说出你在这些额外插槽中应该放什么的版本。)

如果您的字符串中有2个字符,那么它将是2个字节长(可能加上一个空终止符),始终如此

但后来人们意识到英语并不是世界上唯一的语言,事实上,全球数百种语言中有数千个字母。现在该怎么办

嗯,我们可以说只有大约65000个字符让我们感兴趣,并将所有字母编码为两个字节。有一些编码格式可以做到这一点。一个两个字母的字符串将始终是4个字节(嗯,可能前面有一些字节顺序标记,结尾可能有一个空终止符)。有两个问题:a)与ASCII不太向后兼容;b)如果大多数文本都是好的ol'ASCII字符集中的内容,则浪费字节


UTF-8中的步骤,我打赌这是字符串用于编码的内容,或者类似的内容。ASCII字符,如“a”和“b”,是用一个字节编码的,而更多的外来字符(--blush--从讲英语的角度来看)占用多个字节,其中第一个字节表示“下面的内容将与此字节一起表示字母”。所以你得到了可变宽度编码。因此,两个字母字符串的长度至少为两个字节,但如果它包含非ASCII字符,则长度会更大。

两个单词。“字符编码”每个希腊字符将被编码为两个字节,但斯特伦对字符串的编码方式一无所知。它只是在寻找空终止符。这很好地解释了您的困境:有趣的是,C中没有任何东西禁止使用单字节希腊语编码(WindowsOne或MacGreek,可能还有更多)。然后你会得到你期望的结果。很好的总结,除了从7位到8位ASCII的步骤要多得多。。。涉及。每一个个人电脑克隆人创造者和每一个拉丁语社区——以及一些非拉丁语社区——都利用128个完全免费字符的优势,在他们想要的内容中填充内容,并在未来100年内将自己的系统推广为权威的新ASCII。今天的浏览器仍然必须有一个“手动设置字符集”覆盖来整理这些混乱。或者只使用带有空目的地的
mbsrtowcs()
(它将返回它应该写入的宽字符数)。