我正在尝试获取此 unicode 字符串的长度
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
输出
20
它如何确定 unicode 字符串的长度?
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 模块。此处记录了可用的设置。
您正在寻找mb_strlen
.
函数strlnen
不计算字符数,而是字节数。对于多字节字符,它将返回更高的数字。
改为使用mb_strlen()
来计算实际的字符数。
就像引用的其他答案的附录一样mb_strlen()
:
如果php.in
设置mbstring.func_overload
将第 2 位设置为 1,则将根据默认字符集strlen
计算字符数;否则它将计算字符串中的字节数