所以我发布了几个与制作用PHP编写的现有软件相关的问题,以便更新以支持unicode / utf8。其中一个解决方案是使用PHP的mb_string函数覆盖PHP的默认字符串函数。但是,我看到很多人都在谈论消极后果,但没有人真正详细阐述它们。有人可以解释这些负面后果是什么吗?
为什么用mb_string函数覆盖PHP的默认字符串函数是“坏”的?毕竟比手动替换所有这些函数和相应的mb_函数要简单得多。那我错过了什么?这些负面后果是什么?
答案 0 :(得分:0)
覆盖它们是不好的,因为如果其他开发人员来这个代码工作,那么它可能会做一些他没想到的事情。使用默认功能始终是好的。
答案 1 :(得分:0)
我认为mb_ * family函数更重,因为它们也执行unicode测试,甚至简单的ascii字符串也是如此。因此,在大规模上,它们会降低您的应用程序速度。 (可能不是很重要,但不知何故。)
答案 2 :(得分:0)
我会试着详细说明。
使用mb_*
重载标准字符串函数将对读取和处理二进制文件或一般二进制数据的任何内容产生可怕的后果。如果重载标准函数,则突然strlen($binData)
必然会在某个时刻返回错误的长度。
为什么?
想象一下,二进制数据包含一个字节,其值的范围为0xC0
- 0xDF
,0xE0
- 0xEF
或0xF0
- {{1} }。这些是Unicode起始字节,现在重载的0xF7
将以下字符计为1个字节,而不是它们应分别为2,3和4。
主要问题是strlen
是全球性的。它不仅会影响您自己的脚本,还会影响所有脚本以及它们可能使用的任何框架或库。
当被问到时,我应该启用mbstring.func_overload
。答案永远是,并且应该总是一个响亮的NO。
如果你使用它,你就会被搞砸了,而你将花费无数时间来寻找虫子。可能非常不可修复的错误。
好吧,你可以调用mbstring.func_overload
来使其运行,但它仍然包含开销。 mb_strlen($string, 'latin1')
使用php字符串就像Java字符串这样的事实;他们知道自己的长度。 strlen
解析字符串以计算字节数。