unicode中的字符串长度不同

时间:2011-09-24 06:58:38

标签: php unicode

虽然字符串中的字符数相同,但以下字符串的长度是多少呢

echo strlen("馐 馑 馒 馓 馔 馕 首 馗 馘")."<BR>";
echo strlen("Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ")."<BR>";

输出

35
26

5 个答案:

答案 0 :(得分:10)

第一批字符每个占用三个字节,因为它们在39,000个字符列表中排列,而第二个字符串每个只占用两个字节,大约为400个字节。(字节数/每个字符所需的八位字节在UTF-8 wikipedia article中讨论。)

strlen计算字符串占用的字节数,这会在Unicode中产生奇怪的结果。

答案 1 :(得分:9)

我不是PHP专家,但似乎strlen它计算字节...有mb_strlen计算字符......

编辑 - 有关多字节编码如何工作的进一步参考,请参阅http://en.wikipedia.org/wiki/Variable-width_encoding和esp。 UTF8见http://en.wikipedia.org/wiki/UTF-8

答案 2 :(得分:2)

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

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

打印输出17 - 每个ASCII字符一个字节。

我的猜测是这都是使用UTF-8编码 - 这肯定会与不同的表示宽度一致。

答案 3 :(得分:1)

使用mb_strlen,它会计算提供的编码中的字符数,而不是strlen

中的字节数

答案 4 :(得分:1)

根据this post on php.net/strlen,PHP将传递给strlen的所有字符串解释为ASCII。