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

时间:2008-10-21 16:56:58

标签: php unicode

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

我的回答是:绝对不是

问题在于,一旦超载,就没有简单的方法来“重置”str *函数。

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

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

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

所以,再次,不要使用{{1}}。如果使用多字节字符串,请使用适当的mb_函数。

答案 1 :(得分:4)

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

同样,这个bug report表明mb_overloaded函数的虚拟主机出血已在5.2 / 5.3 CVS版本中得到纠正。该错误特定于每个目录的配置。