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

JW.*_*JW. 5 php unicode

我正在使我的PHP站点支持Unicode.我想知道是否有人有mbstring.func_overload设置经验,strlen用其多字节等价物(mb_strlen)替换正常的字符串函数(例如).PHP手册页上没有任何评论.

我应该注意哪些潜在的问题?调用多字节版本的任何情况都是个坏主意?

我想一个例子是处理加密的函数,因为它们可能期望处理字节串而不是字符串.

此外,手册页还包含一个注释:"不建议在每个目录上下文中使用函数重载选项,因为在生产环境中尚未确认它足够稳定并且可能导致未定义的行为."

这是否意味着它在每个目录的上下文中不稳定,或者它通常不稳定?措辞不清楚.

gph*_*lip 5

我的回答是:绝对不是!

问题是,一旦它们过载,就没有简单的方法来"重置"str*函数.

有一段时间,这可以很好地适用于您的项目,但几乎可以肯定,您将遇到使用字符串函数的外部库,例如,实现二进制协议,它们将失败.他们将失败,你将花费数小时试图找出他们失败的原因.

在您发现它之后mbstring.func_overload,您没有太多选择.mbstring.internal_encoding每次调用外部库并将其设置回来之后,你都可以将ini_set设置为一个每字节一个字节的编码,但是如果你的库对你的应用程序进行回调,那么它就会搞乱.

另一种选择是手动调整库,将所有str*函数更改为其mb_string对应函数,并将每字节一个字节作为编码参数传递.但是,这也不是一个好主意,因为您失去了轻松更新外部功能的能力,并且您可能也会导致一些性能问题.

所以,再次,不要使用func_overload.如果使用多字节字符串,请使用适当的mb_函数.


Owe*_*wen 4

您绝对应该注意的一个问题是使用非 mb 感知版本的函数的第 3 方脚本(可能是库或 pear 扩展)。例如,strlen()如果您超载,所使用的库可能会导致问题。

此外,此错误报告显示 mb_overloaded 函数的虚拟主机泄漏已在 5.2/5.3 CVS 版本中得到纠正。该错误特定于每个目录的配置。