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

Mun*_*nib 10 php strlen

我试图获得这个unicode字符串的长度

$text = '??? ????? ?';
$length = strlen($text);
echo $length;
Run Code Online (Sandbox Code Playgroud)

产量

20
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ski 27

strlen()没有正确处理多字节字符,因为它假设1个字符等于1个字节,这对于unicode是无效的.此行为已明确记录:

strlen的()返回的字节的数目,而不是字符数在字符串.

解决方案是使用mb_strlen()函数代替(mb代表multi byte)(参见mb_strlen()docs).

编辑

如果由于任何原因无法/可行地更改代码,可能需要确保字符串函数由多字节对应项自动重载:

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

这是由PHP支持并在此处记录的(注意它自PHP 7.2以来已被弃用).

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

  • 很快 - 这是因为 PHP 设计(作为语言)在很多地方都很糟糕,这也包括 UTF8 支持。PHP 在内部不支持多字节编码已经很长时间了,这就是创建多字节扩展的原因。您可以使用函数重载让 PHP 自动使用 `mb_` -> 参见 http://php.net/manual/en/mbstring.overload.php 但这取决于 PHP 配置,因此有时直接使用 `mb_ 可能会更好` 如果您不能确保它会以其他方式使用。 (2认同)

Jon*_*Jon 5

您正在寻找mb_strlen.