我应该重构我所有的框架来使用mbstring函数吗?


Should i refactor all my framework to use mbstring functions?

我目前使用mbstring.func_overload = 7来使用UTF-8字符集。

我正在考虑重构所有的函数调用,使用mb_*函数。

你认为这是必要的吗,或者PHP 6或更新版本的多字节问题将以另一种方式解决?

如果您正在使用其他人创建的库,则不建议使用。以下是三个原因。

  1. 重载会破坏不期望重载的库的行为。
  2. 你的框架可以在没有重载的环境中被破坏。
  3. 依赖于重载会减少框架的潜在用户,因为2

1的好例子。使用strlen计算HTTP Content-Length字段的字节大小错误。原因是重载的strlen函数返回的不是字节数,而是字符数。你可以在CakePHP和Zend_Http_Client中看到真实世界的问题。

编辑:

不以为然的mbstring。func_overload正在考虑在PHP 5.5或5.6中(来自mbstring维护者2012年4月的邮件)。所以现在应该避免mbstring.func_overload.

在各种平台上处理多字节字符的推荐策略是直接使用mbstring或intl或iconv。如果确实需要处理多字节字符的回退函数,请使用function_exists()

你可以在WordpressMediaWiki中看到这种情况。
  1. WordPress: wp-includes/compact.php
  2. MediaWiki: Fallback Class

一些cms如Drupal (unicocde.inc)引入了多字节抽象层。

我认为抽象层不是一个好主意。原因是在很多情况下需要处理的多字节函数的数量在10个以下,如果安装了这些模块,多字节函数易于使用,并且将处理切换到mbstring或intl或iconv会降低性能。

处理多字节字符的最低要求是mb_substr()并处理无效字节序列。您可以在上述cms中看到mb_substr()的回退函数的情况。我回答了关于在以下地方处理无效字节序列:用问号,mbstring替换无效的UTF-8字符。

对于utf-8(当然)的字符串

是的,当然。你可以用字符串做很多事情。UTF-8向后兼容ASCII。如果您只想对字符串的ASCII字符进行操作,则可能会产生差异,也可能不会。这取决于你需要对你的字符串做什么

如果你想要一个直接的答案:No,你不应该把每个函数重构成一个mb_函数,因为它可能是多余的。您是否应该检查用例中多字节UTF-8字符串是否会影响结果并相应地进行重构?是的。