7

我有一个 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 天时间试图找到解决方案,但没有运气。有谁知道这种行为的原因是什么?

4

5 回答 5

8

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

编辑

引用文档链接:

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

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

于 2013-03-11T15:32:37.180 回答
2

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

int mb_strlen ( string $str [, string $encoding ] )
Gets the length of a string.
于 2013-03-11T15:29:43.207 回答
0

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

于 2013-03-11T15:31:48.630 回答
0

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

于 2013-03-11T15:30:23.550 回答
0

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

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

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

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

于 2021-05-24T05:04:21.123 回答