【问题标题】:strlen() php function giving the wrong length of unicode characters [duplicate]strlen() php函数给出了错误的unicode字符长度[重复]
【发布时间】:2013-03-27 14:38:53
【问题描述】:

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

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

输出

20

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

【问题讨论】:

    标签: php strlen


    【解决方案1】:

    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。

    【讨论】:

    • 我想知道,分离unicode/non-unicode函数的具体点是什么?为什么不总是使用(mb_) 函数?
    • 简短地说 - 这是因为 PHP 设计(作为语言)在很多地方都很糟糕,这也包括 UTF8 支持。 PHP 在内部很长时间不支持多字节编码,这就是创建多字节扩展的原因。您可以使用函数重载让 PHP 自动使用 mb_ -> 请参阅 php.net/manual/en/mbstring.overload.php 但这取决于 PHP 配置,因此如果您不能确保以其他方式使用 mb_,有时可能会更好。跨度>
    • 谢谢你的解释,我的朋友,特别是指着overload,完全错过了..干杯!
    • 好吧,由于某种原因,mb_strlen($text) 不能直接在我的系统上运行。您可能想指定编码类型: $len=mb_strlen($text,'UTF-8');为了安全起见。
    • 您可能还想编辑您的php.ini 并将其设置在那里。见:php.net/manual/en/mbstring.configuration.php
    【解决方案2】:

    您正在寻找mb_strlen。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-08
          • 1970-01-01
          • 2015-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          相关资源
          最近更新 更多