因此,我已经发布了几个问题,这些问题与更新用PHP编写的现有软件以支持unicode / utf8有关。其中一个解决方案是用PHP的mb_string函数覆盖PHP的默认字符串函数。然而,我看到很多人都在谈论负面后果,但没有人真正详细说明它们。有人能解释一下这些负面后果是什么吗?
为什么用mb_string函数覆盖PHP的默认字符串函数是“不好的”呢?毕竟,这比手动将所有这些函数替换为相应的mb_函数要简单得多。那么我错过了什么呢?这些负面后果是什么?
发布于 2013-03-24 11:40:30
覆盖它们是不好的,因为如果其他开发人员来处理这些代码,那么它可能会做一些他没有预料到的事情。使用默认函数总是好的,因为它们是预期的。
发布于 2013-03-24 13:05:24
我认为mb_*家族的功能更重,因为即使是简单的ascii字符串,他们也可以执行unicode测试。因此,在很大程度上,它们会减慢应用程序的速度。(可能意义不大,但以某种方式肯定存在。)
发布于 2015-08-28 21:01:31
我将尝试详细说明。
使用mb_*重载标准字符串函数将对读取和处理二进制文件或一般的二进制数据产生可怕的后果。如果你重载了标准函数,那么strlen($binData)在某些时候肯定会返回错误的长度。
为什么?
假设二进制数据包含一个字节,其值在0xC0-0xDF、0xE0-0xEF或0xF0-0xF7范围内。这些字符是Unicode开始字节,现在重载的strlen会将以下字符计为1字节,而不是它们应该分别计算的2、3和4字节。
主要的问题是mbstring.func_overload是全球性的。它不仅会影响你自己的脚本,还会影响所有的脚本,以及它们可能使用的任何框架或库。
当系统询问我是否应该启用mbstring.func_overload时。答案总是,也应该永远是响亮的“不”。
如果你使用它,你就完蛋了,而且你会花费无数的时间来寻找bug。很可能是无法修复的Bugs。
嗯,你可以调用mb_strlen($string, 'latin1')来让它正常工作,但是它仍然包含一些开销。strlen利用了php字符串类似于Java字符串的事实;它们知道自己的长度。mb_strlen解析字符串以计算字节数。
https://stackoverflow.com/questions/15594779
复制相似问题