21

我正在尝试获取此 unicode 字符串的长度

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

输出

20

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

4

4 回答 4

42

strlen()没有正确处理多字节字符,因为它假定 1 个字符等于 1 个字节,这对 unicode 根本无效。这种行为被清楚地记录在案

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

解决方案是改用mb_strlen()函数(mb代表multi byte)(参见 mb_strlen() 文档)。

编辑

如果由于某种原因无法更改代码/不可行,则可能希望确保字符串函数被多字节对应函数自动重载:

要使用函数重载,请将 php.ini 中的 mbstring.func_overload 设置为一个正值,该值表示指定要重载的函数类别的位掩码组合。它应该设置为 1 以重载 mail() 函数。2个用于字符串函数,4个用于正则表达式函数。例如,如果设置为 7,邮件、字符串和正则表达式函数将被重载。

这由 PHP 支持并在此处记录请注意,此功能在 PHP 7.2 和更新版本中已弃用)。

请注意,您可能还需要编辑您的php.ini以确保启用 mb_string 模块。此处记录了可用的设置。

于 2013-04-05T08:51:25.467 回答
3

您正在寻找mb_strlen.

于 2013-04-05T08:49:40.290 回答
2

函数strlnen不计算字符数,而是字节数。对于多字节字符,它将返回更高的数字。
改为使用mb_strlen()来计算实际的字符数。

于 2013-04-05T08:53:36.060 回答
0

就像引用的其他答案的附录一样mb_strlen()

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

于 2013-04-05T08:56:09.020 回答