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

时间:2011-12-18 22:53:20

标签: php utf-8 multibyte

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

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

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

2 个答案:

答案 0 :(得分:4)

如果您使用其他人创建的库,则不推荐使用。这有三个原因。

  1. 重载可能会破坏不期望重载的库的行为。
  2. 您的框架可以在没有超载的环境中被破坏。
  3. 由于2
  4. ,根据重载减少了框架的潜在用户

    1的好例子是使用 strlen 在HTTP Content-Length 字段中错误计算字节大小。原因是重载的 strlen 函数不会返回字节的数量,而是返回字符的数量。您可以在CakePHPZend_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 中查看案例。

    1. WordPress:wp-includes/compact.php
    2. MediaWiki:Fallback Class
    3. 一些像 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字符串可能会影响结果并相应地重构?是。