strlen()php函数给出了unicode字符的错误长度

时间:2013-04-05 08:48:14

标签: php strlen

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

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

输出

20

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

4 个答案:

答案 0 :(得分:26)

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,则为mail,strings   正则表达式函数将被重载。

这得到了PHP和documented here的支持(注意它自PHP 7.2以来已被弃用)。

请注意,您可能还需要编辑php.ini以确保启用了mb_string模块。可用设置为documented here

答案 1 :(得分:2)

您正在寻找mb_strlen

答案 2 :(得分:1)

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

答案 3 :(得分:0)

正如引用mb_strlen()的其他答案的附录:

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

bytes 的数量