【问题标题】:PHP: strlen returns character length instead of byte lengthPHP:strlen 返回字符长度而不是字节长度
【发布时间】:2013-02-26 20:30:58
【问题描述】:

我有一个 wordpress 网站。

我创建了简单的页面模板,例如:

<?php 
 /**
 * Template Name: Test
 */

 echo strlen('Привет');

 ?>

然后我使用这个模板创建了一个页面。该页面显示俄语字符串“Привет”(意思是“你好”)的长度。我希望看到 12,因为由 6 个字符组成的 UTF-8 编码的俄罗斯字符串应该有 12 个字节的大小,但我得到了 6 个。

我已经在其他服务器上测试了同样的东西并且得到了正确的值 - 12。所以我认为原因是我的服务器配置。我有 wp 3.2.1(升级到 wp 3.5.1 后我遇到了同样的问题)和 PHP 5.3.3。

目前我花了大约 5 天时间试图找到解决方案,但没有运气。有谁知道这种行为的原因是什么?

【问题讨论】:

标签: php wordpress strlen


【解决方案1】:

我的文件设置为“UCS-2 BE BOM”编码。 (可以从notepad++-Encoding菜单选项查看)

然后我使用了 mb_strlen($line,"UCS-2") 函数,但是由于某种原因,我得到了不正确的字符串长度(例如 mb_strlen("somestr","UCS-2") -> 6,其中我期待 7)

我已将文件的编码更改为“UTF-8”,并且能够获得正确的字符串长度。

我不确定为什么使用其他编码类型时字符串长度不正确,但我想分享一下对我有用的方法。

【讨论】:

    【解决方案2】:

    检查php.ini 中的mbstring.func_overload 设置。此选项允许 PHP 使用 mb_strlen() 覆盖 strlen() 函数(对于其他等效项也是如此)。这可以解释您的服务器之间的差异

    编辑

    引用文档链接:

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

    因此,带有2 bit 集合的值意味着基本字符串函数将被其等效的mbstring 重载,但不是邮件或正则表达式函数;如果你想要 normal 行为,这应该是 0

    【讨论】:

    • 这是正确的(和documented)答案。
    • 我有 mbstring.func_overload = "2"。对我来说正确的值应该是多少?
    • 0。听起来您根本不希望多字节函数遮蔽普通函数。
    【解决方案3】:

    有关获取多字节字符的字符串长度的更多信息,请参阅http://php.net/manual/en/function.mb-strlen.php

    【讨论】:

      【解决方案4】:

      您需要为此使用多字节字符串函数吗?如http://www.php.net/manual/en/function.mb-strlen.php

      【讨论】:

      • 似乎 OP 想要字节数(不是字符数),这正是 strlen 确实应该返回的。
      • 问题是我不使用mb_strlen。我知道在我的情况下 mb_strlen 会显示 6,但为什么 strlen 会这样做......我不知道......
      【解决方案5】:

      你试过了吗:http://lt.php.net/manual/en/function.mb-strlen.php

      int mb_strlen ( string $str [, string $encoding ] )
      Gets the length of a string.
      

      【讨论】:

      • 问题是我需要 strlen 正常工作并返回字节数。
      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2016-05-15
      相关资源
      最近更新 更多