以下字符串的长度为什么不同,尽管字符串中的字符数是相同的?
echo strlen("馐 馑 馒 馓 馔 馕 首 馗 馘")."<BR>";
echo strlen("Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ")."<BR>";
输出
35
26
echo strlen("馐 馑 馒 馓 馔 馕 首 馗 馘")."<BR>";
echo strlen("Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ")."<BR>";
输出
35
26
第一批字符每个占用三个字节,因为它们在接近3.9万的字符列表底部,而第二批只有每个字符占两个字节,它们是在约400左右的位置。(每个字符所需的字节数/八位字节单位在UTF-8维基百科文章中有讨论。)
strlen函数计算字符串占用的字节数,这在Unicode编码下给出了奇怪的结果。
a
在位置 129,二进制表示为 01000001
,因此占用一个字节。
é
在位置 233,二进制表示为 11101001
,但是在 UTF-8 中最后一位是“保留位”,因此它被编码为 11000011 10101001
,占用两个字节(这就是为什么有时会看到 é
被替换为 é
,因为这两个字符分别是这两个字节的 ASCII 字符)。我不记得每个位的确切含义或编码方法,但那就是大致的想法。 - Niet the Dark Absolstrlen
函数计算的是字节数...可以使用mb_strlen
函数来计算字符数...
编辑 - 关于多字节编码的详细信息,请参见http://en.wikipedia.org/wiki/Variable-width_encoding,特别是UTF8,请参见http://en.wikipedia.org/wiki/UTF-8。看起来它正在计算使用的编码中的字节数。例如,第二个字符串每个非空格字符占用两个字节,而第一个字符串每个非空格字符占用三个字节。我会预期:
echo strlen("A B C D E F G H I")
将17以每个ASCII字符一个字节的方式打印出来。
我猜测这里使用的是UTF-8编码,这与不同宽度的表示方式相符。