【发布时间】:2013-03-27 14:38:53
【问题描述】:
我正在尝试获取此 unicode 字符串的长度
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
输出
20
如何确定unicode字符串的长度?
【问题讨论】:
我正在尝试获取此 unicode 字符串的长度
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
输出
20
如何确定unicode字符串的长度?
【问题讨论】:
strlen() 没有正确处理多字节字符,因为它假定 1 个字符等于 1 个字节,这对于 unicode 根本无效。这种行为是clearly documented:
strlen() 返回字节数,而不是字符串中的字符数。
解决办法是改用mb_strlen()函数(mb代表multi byte)(see mb_strlen() docs)。
编辑
如果由于某种原因无法更改代码,可能需要确保字符串函数被多字节对应函数自动重载:
要使用函数重载,请将 php.ini 中的 mbstring.func_overload 设置为 一个正值,表示指定位掩码的组合 要重载的函数的类别。它应该设置为 1 到 重载 mail() 函数。 2个字符串函数,4个常规函数 表达功能。例如,如果设置为 7,邮件,字符串 并且正则表达式函数会被重载。
PHP 和 documented here 支持此功能(请注意,此功能在 PHP 7.2 及更高版本中已弃用)。
请注意,您可能还需要编辑 php.ini 以确保启用 mb_string 模块。可用设置为documented here。
【讨论】:
(mb_) 函数?
mb_ -> 请参阅 php.net/manual/en/mbstring.overload.php 但这取决于 PHP 配置,因此如果您不能确保以其他方式使用 mb_,有时可能会更好。跨度>
overload,完全错过了..干杯!
php.ini 并将其设置在那里。见:php.net/manual/en/mbstring.configuration.php
您正在寻找mb_strlen。
【讨论】:
函数strlnen不计算字符数,而是计算字节数。对于多字节字符,它将返回更高的数字。
请改用mb_strlen() 来计算实际字符数。
【讨论】:
就像引用 mb_strlen() 的其他答案的附录:
如果php.in 设置mbstring.func_overload 的第2 位设置为1,则strlen 将根据默认字符集计算字符;否则会统计字符串中的字节数
【讨论】: