1

因此,我发布了几个与使现有的用 PHP 编写的软件更新以支持 unicode / utf8 相关的问题。解决方案之一是使用 PHP 的 mb_string 函数覆盖 PHP 的默认字符串函数。但是,我看到很多人在谈论负面后果,但没有人真正详细说明它们。有人可以解释一下这些负面后果是什么吗?

为什么用 mb_string 函数覆盖 PHP 的默认字符串函数是“不好的”?毕竟,这比手动用相应的 mb_ 函数替换所有这些函数要简单得多。那么我错过了什么?这些负面后果是什么?

4

3 回答 3

0

It's bad to override them because if some other developer comes and works on this code then it might do something that he wasn't expecting. It's always good to use the default functions as they were intended.

于 2013-03-24T03:40:29.903 回答
0

我认为 mb_* 系列函数更重,因为它们也执行 unicode 测试,即使是简单的 ascii 字符串也是如此。因此,在大规模情况下,它们会减慢您的应用程序速度。(可能意义不大,但不知何故肯定。)

于 2013-03-24T05:05:23.733 回答
0

我会尝试详细说明。

重载标准字符串函数mb_*将对读取和处理二进制文件或一般的二进制数据产生可怕的后果。如果你重载标准函数,那么strlen($binData)在某些时候突然会返回错误的长度。

为什么?

想象一下二进制数据包含一个字节,其值在0xC0- 0xDF0xE0-0xEF0xF0-范围内0xF7。这些是 Unicode 起始字节,现在重载strlen的字符会将以下字符计为 1 个字节,而不是它们应该分别是 2、3 和 4。

主要问题是这mbstring.func_overload是全球性的。它不仅会影响您自己的脚本,还会影响所有脚本以及它们可能使用的任何框架或库。

当被问到,我应该启用mbstring.func_overload. 答案永远是,而且应该永远是一个响亮的“否”。

如果您使用它,您将被彻底搞砸,您花费无数小时来寻找错误。很可能无法修复的错误。

好吧,您可以调用mb_strlen($string, 'latin1')以使其正常运行,但它仍然包含开销。strlen使用 php 字符串类似于 Java 字符串的事实;他们知道自己的长度。mb_strlen解析字符串以计算字节数。

于 2015-08-28T13:01:30.593 回答