PHP:strlen返回字符长度而不是字节长度

时间:2013-03-11 15:27:42

标签: php wordpress strlen

我有一个wordpress网站。

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

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

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

 ?>

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

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

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

5 个答案:

答案 0 :(得分:8)

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

修改

从文档链接引用:

  

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

因此设置2 bit的值意味着基本字符串函数将使用其mbstring等效函数重载,但不会重载邮件或正则表达式函数;如果你想要normal行为,那应该是0

答案 1 :(得分:2)

您是否尝试过:http://lt.php.net/manual/en/function.mb-strlen.php

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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