Unicode编码中字符串的长度不同。

7
以下字符串的长度为什么不同,尽管字符串中的字符数是相同的?
echo strlen("馐 馑 馒 馓 馔 馕 首 馗 馘")."<BR>";
echo strlen("Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ")."<BR>";

输出

35
26

@stereofrog 例如字母'a'怎么样?当我们用strlen计算它的Unicode值时,得到的结果是1。 - Imran Omar Bukhsh
这是我的操作方式,例如:echo mb_strlen("αβγδε",mb_detect_encoding("αβγδε")); 它输出5。 - Melsi
5个回答

11

第一批字符每个占用三个字节,因为它们在接近3.9万的字符列表底部,而第二批只有每个字符占两个字节,它们是在约400左右的位置。(每个字符所需的字节数/八位字节单位在UTF-8维基百科文章中有讨论。)

strlen函数计算字符串占用的字节数,这在Unicode编码下给出了奇怪的结果。


你能进一步解释一下它们是如何取三个字节和两个字节的吗? - Imran Omar Bukhsh
我不是Unicode工作原理的专家,但基本上每个字符都是一个可变长度的字节,每个字节的最高有效位告诉读者长度或其他信息。当我需要了解时,我只是在谷歌上搜索了Unicode。 - Niet the Dark Absol
例如字母'a'的情况怎么样?当我们用strlen函数获取它的Unicode值时,结果为1。 - Imran Omar Bukhsh
1
a 在位置 129,二进制表示为 01000001,因此占用一个字节。 é 在位置 233,二进制表示为 11101001,但是在 UTF-8 中最后一位是“保留位”,因此它被编码为 11000011 10101001,占用两个字节(这就是为什么有时会看到 é 被替换为 é,因为这两个字符分别是这两个字节的 ASCII 字符)。我不记得每个位的确切含义或编码方法,但那就是大致的想法。 - Niet the Dark Absol

9

2

看起来它正在计算使用的编码中的字节数。例如,第二个字符串每个非空格字符占用两个字节,而第一个字符串每个非空格字符占用三个字节。我会预期:

echo strlen("A B C D E F G H I")

将17以每个ASCII字符一个字节的方式打印出来。

我猜测这里使用的是UTF-8编码,这与不同宽度的表示方式相符。


1
使用mb_strlen,它会计算提供的编码中的字符数,而不是像strlen一样计算字节数。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接