我正在使我的PHP站点支持Unicode.我想知道是否有人有mbstring.func_overload
设置经验,strlen
用其多字节等价物(mb_strlen
)替换正常的字符串函数(例如).PHP手册页上没有任何评论.
我应该注意哪些潜在的问题?调用多字节版本的任何情况都是个坏主意?
我想一个例子是处理加密的函数,因为它们可能期望处理字节串而不是字符串.
此外,手册页还包含一个注释:"不建议在每个目录上下文中使用函数重载选项,因为在生产环境中尚未确认它足够稳定并且可能导致未定义的行为."
这是否意味着它在每个目录的上下文中不稳定,或者它通常不稳定?措辞不清楚.
我的回答是:绝对不是!
问题是,一旦它们过载,就没有简单的方法来"重置"str*函数.
有一段时间,这可以很好地适用于您的项目,但几乎可以肯定,您将遇到使用字符串函数的外部库,例如,实现二进制协议,它们将失败.他们将失败,你将花费数小时试图找出他们失败的原因.
在您发现它之后mbstring.func_overload
,您没有太多选择.mbstring.internal_encoding
每次调用外部库并将其设置回来之后,你都可以将ini_set设置为一个每字节一个字节的编码,但是如果你的库对你的应用程序进行回调,那么它就会搞乱.
另一种选择是手动调整库,将所有str*函数更改为其mb_string对应函数,并将每字节一个字节作为编码参数传递.但是,这也不是一个好主意,因为您失去了轻松更新外部功能的能力,并且您可能也会导致一些性能问题.
所以,再次,不要使用func_overload
.如果使用多字节字符串,请使用适当的mb_函数.