我正在使我的PHP站点支持Unicode。我想知道是否有人有mbstring.func_overload
设置的经验,它用正常的字符串函数(例如strlen
)替换它们的多字节等价物(mb_strlen
)。 PHP手册页上没有任何评论。
我应该注意哪些潜在的问题?调用多字节版本的任何情况都是个坏主意?
我想一个例子是处理加密的函数,因为它们可能期望处理字节串而不是字符串。
此外,手册页还包含一个注释:“不建议在每个目录上下文中使用函数重载选项,因为在生产环境中尚未确认其足够稳定并且可能导致未定义的行为。 “
这是否意味着它在每个目录上下文中不稳定,或者它通常不稳定?措辞不清楚。
答案 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版本中得到纠正。该错误特定于每个目录的配置。