strlen() PHP函数给出的Unicode字符长度不正确

23

我正在尝试获取这个Unicode字符字符串的长度

$text = 'نام سلطان م';
$length = strlen($text);
echo $length;

输出

20

它如何确定Unicode字符字符串的长度?

4个回答

47

strlen() 不正确地处理多字节字符,因为它假定一个字符等于一个字节,这对于 Unicode 来说是无效的。这种行为已经清楚地记录

strlen() 返回字符串中字节数而不是字符数

解决方法是使用 mb_strlen() 函数(mb 代表 multi byte)(请参阅 mb_strlen() 文档)。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Ilia
2
简而言之,这是因为 PHP 的设计(作为语言)在许多方面都很糟糕,其中包括对 UTF8 的支持。PHP 在内部长期不支持多字节编码,这就是为什么创建了多字节扩展的原因。您可以使用函数重载使 PHP 自动使用 mb_ -> 请参见 http://php.net/manual/en/mbstring.overload.php,但这取决于 PHP 配置,因此如果您无法确保以其他方式使用它,则直接使用 mb_ 可能更好。 - Marcin Orlowski
感谢你的解释,我的朋友,特别是指出了overload,我完全忽略了它。干杯! - Ilia
1
不知道为什么在我的系统上直接使用mb_strlen($text)无法正常工作。你可能需要指定编码类型:$len=mb_strlen($text,'UTF-8')。为了保险起见。 - tormuto
在我们编写的一个金融系统中,strlenmb_strlen之间的差异给我们带来了巨大的错误。当我们使用strlen时,我们发现一些发送带有Unicode字符的短信消息的客户被多收费了。小心啊,各位,不要陷入我们曾经遇到的同样的陷阱。 - Moses Ndeda
显示剩余3条评论

5
你正在寻找 mb_strlen 相关信息,它与IT技术有关。

3

strlen函数并不计算字符的个数,而是计算字节数。对于多字节字符,它将返回更高的数字。
使用mb_strlen()代替可以计算实际字符数量。


0

关于其他提到 mb_strlen() 的答案,我想补充一点:

如果 php.in 设置中的 mbstring.func_overload 的第二位设置为 1,则 strlen 函数将根据默认字符集计算字符串的 字符 数量;否则它将计算字符串中的 字节数


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