我应该使用多字节重载(mbstring.func_overload)吗?

6
我正在使我的PHP网站支持Unicode。我想知道是否有人使用过mbstring.func_overload设置,该设置将普通的字符串函数(如strlen)替换为它们的多字节版本(如mb_strlen)。在PHP手册页面上没有任何注释。
我应该注意哪些潜在问题?有哪些情况下调用多字节版本是不明智的?
我想一个例子可能是处理加密的函数,因为它们可能期望处理字节而不是字符的字符串。
此外,手册页面包括一条注释:“不建议在每个目录上下文中使用函数重载选项,因为尚未确认其在生产环境中足够稳定,可能会导致未定义的行为。”
这是否意味着在每个目录上下文中不稳定,还是总体上不稳定?措辞不清楚。
2个回答

7
我的回答是:绝对不!
问题在于,一旦str*函数被重载,没有容易的方法来“重置”它们。
在你的项目中,这段时间可能会很顺利,但几乎可以肯定的是,你将遇到使用字符串函数来实现二进制协议的外部库,它们会失败。它们将失败,你将花费数小时的时间试图找出它们为什么会失败。
在你发现是mbstring.func_overload之后,你就没有太多选择了。每次调用外部库时,你可以ini_set mbstring.internal_encoding为每个字符一个字节的编码,然后立即设置回去,但如果你的库回调你的应用程序,它只会把事情弄糟。
另一个选择是手动调整库,将所有str*函数更改为它们的mb_string对应函数,并传递每个字符一个字节作为编码参数。然而,这也不是一个好主意,因为你失去了轻松更新外部库的能力,而且可能会引起一些性能问题。
所以,再次提醒,不要使用func_overload。如果你使用多字节字符串,请使用相应的mb_函数。

1
mbstring.func_overload让我遇到了麻烦,我不禁想知道有多少当前未解决的问题是由于此引起的。我编写了一个生成ePub文件的类和一个处理Zip文件的伴侣类。内置的Zip函数无法满足一些要求。我花了整个周末查找,直到报告错误的人提到他们已经设置他们的服务器使用utf-8。我甚至不知道mbstring.func_overload的存在,现在我陷入了麻烦,因为将mbstring设置为使用ascii也不可能,因为我还使用mb_函数来处理UTF-8。 - A.Grandt

4

你需要注意的一个问题是第三方脚本(例如库或pear扩展)使用不支持多字节的函数版本。例如,使用strlen()的库可能会导致问题,如果你超载它。

此外,这个错误报告显示在5.2/5.3 CVS版本中已经纠正了mb_overloaded函数的虚拟主机泄漏问题。该错误只与目录配置有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接