Php 我应该使用多字节重载(mbstring.func_重载)吗?
我正在让我的PHP站点了解Unicode。我想知道是否有人有过使用Php 我应该使用多字节重载(mbstring.func_重载)吗?,php,unicode,Php,Unicode,我正在让我的PHP站点了解Unicode。我想知道是否有人有过使用mbstring.func_重载设置的经验,该设置使用多字节等价物(mb_strlen)替换普通字符串函数(例如strlen)。PHP手册页面上没有任何注释 我是否应该注意到任何潜在的问题?在任何情况下调用多字节版本都是一个坏主意 我想一个例子是处理加密的函数,因为它们可能希望处理字节字符串,而不是字符字符串 此外,手册页面还包括一条注释:“不建议在每个目录上下文中使用函数重载选项,因为尚未确认它在生产环境中是否足够稳定,并可能导
mbstring.func_重载
设置的经验,该设置使用多字节等价物(mb_strlen
)替换普通字符串函数(例如strlen
)。PHP手册页面上没有任何注释
我是否应该注意到任何潜在的问题?在任何情况下调用多字节版本都是一个坏主意
我想一个例子是处理加密的函数,因为它们可能希望处理字节字符串,而不是字符字符串
此外,手册页面还包括一条注释:“不建议在每个目录上下文中使用函数重载选项,因为尚未确认它在生产环境中是否足够稳定,并可能导致未定义的行为。”
这是否意味着它在每个目录上下文中不稳定,或者通常不稳定?措辞不清楚。您必须注意的一个问题是使用不支持mb的函数版本的第三方脚本(可能是库或pear扩展)。例如,使用strlen()的库如果过载可能会导致问题 同样,这表明在5.2/5.3 CVS版本中,mb_重载函数的虚拟主机泄漏已得到纠正。这个错误是特定于每个目录配置的。我的答案是:绝对不是 问题是,一旦str*函数重载,就没有简单的方法“重置”它们 在一段时间内,这可以很好地用于您的项目,但几乎可以肯定的是,您将遇到一个外部库,该库使用字符串函数(例如)来实现二进制协议,它们将失败。他们会失败,你会花几个小时试图找出他们失败的原因 在您发现它是
mbstring.func\u重载之后,您就没有太多的选项了。您可以在每次调用外部库时将mbstring.internal\u encoding
设置为每字符一个字节的编码,然后立即将其设置回原来的值,但是如果库回调应用程序,它只会把事情搞砸
另一个选项是手动调整库,将所有str*函数更改为对应的mb_字符串,并将每个字符一个字节作为编码参数传递。但是,这也不是一个好主意,因为您失去了轻松更新外部数据的能力,并且可能会导致一些性能问题
因此,再次强调,不要使用func\u重载
。如果您使用多字节字符串,请使用适当的mb_u函数。mbstring.func_u重载以一种不好的方式咬了我一口,我想知道我收到的当前未解决的问题中有多少是由此引起的。我编写了一个类来生成ePub文件,并编写了一个伴生类来处理Zip文件。内置Zip函数没有用是有一些原因的。我花了整个周末的时间去寻找,直到报告错误的人提到他们已经将服务器设置为使用utf-8。我甚至不知道mbstring.func_重载的存在,现在我遇到了麻烦,因为将mbstring设置为使用ascii也是不可能的,因为我还将UTF-8与mb_函数一起使用。