我目前使用mbstring.func_overload = 7
来使用UTF-8字符集。
我正在考虑重构所有func调用以使用mb_*
函数。
您认为这是必然的,或者使用PHP 6或更新版本,多字节问题将以另一种方式解决?
答案 0 :(得分:4)
如果您使用其他人创建的库,则不推荐使用。这有三个原因。
1的好例子是使用 strlen 在HTTP Content-Length 字段中错误计算字节大小。原因是重载的 strlen 函数不会返回字节的数量,而是返回字符的数量。您可以在CakePHP和Zend_Http_Client中看到真实世界的问题。
修改强> 弃用mbstring.func_overload正在考虑PHP 5.5或5.6(2012年4月来自mbstring maintainer's mail)。所以现在你应该避免使用mbstring.func_overload。
为各种平台处理mutibyte字符的推荐策略是直接使用mbstring或intl或iconv。如果您确实需要用于处理多字节字符的后备函数,请使用 function_exists()。
您可以在 Wordpress 和 MediaWiki 中查看案例。
一些像 Drupal (unicocde.inc)这样的CMS引入了多字节抽象层。
我认为抽象层不是好主意。 原因是在很多情况下需要处理多字节函数的数量小于10,并且udultibyte函数易于使用,并且如果安装了这些模块,则将处理切换为mbstring或intl或iconv的性能降低。
处理多字节字符的最低要求是 mb_substr()并处理无效的字节序列。
您可以在上述CMS中看到 mb_substr()的回退功能。
我回答了在以下地方处理无效字节序列:Replacing invalid UTF-8 characters by question marks, mbstring.substitute_character seems
答案 1 :(得分:1)
表示字符串为utf-8(当然)
是的,当然是。但是你可以用弦乐做很多事情。 UTF-8向后兼容ASCII。如果您只想对字符串的ASCII字符进行操作,则可能会也可能不会产生影响。这取决于你需要做什么和你的字符串。
如果你想直接回答:否,你不应该将每个函数都重构为mb_
函数,因为它可能有点过分。您是否应该检查您的用例是否多字节UTF-8字符串可能会影响结果并相应地重构?是。