【问题标题】:What to do with Unicode non-awareness in PHP < 6?如何处理 PHP < 6 中的 Unicode 无意识?
【发布时间】:2009-12-27 16:00:30
【问题描述】:

我正在开发一个需要了解 Unicode 的项目。 PHP 提供了许多有用的函数,如 str_count_words() 来计算某些输入中的单词数,但它们不适用于 PHP

我该怎么办? PHP 6 还没有推出,所以我不能要求人们拥有它才能使用我的软件...

我应该只为字符串函数编写一个包装库吗?如果版本低于 6,将使用 PHP 6 的函数或我自己的函数?

【问题讨论】:

  • 必须是 PHP 吗?如果 Unicode 支持是一个核心问题,PHP5 可能不是平台的最佳选择。
  • 这是一个必须在尽可能多的平台和服务器上运行的 Web 应用程序。它必须支持 Postgres、MySQL、SQL Server 和 Oracle RDBMS。它必须支持 XML 解析,并且还有很多其他要求,坦率地说,PHP 似乎最有意义。
  • 其他现代脚本语言当然可以很好地处理 XML 和数据库,同时也原生支持 Unicode 字符串。例如。 Python、ASP.NET、Java 的各种脚本编写可能性。虽然 PHP 支持在cheapo 共享主机上最为普遍,但在很长一段时间内只会成为 PHP5,而且 PHP5 中的 Unicode 支持非常不合标准。

标签: php unicode function


【解决方案1】:

您可以使用multibyte string comparison 函数。

另一个好主意可能是看看其他人是如何做到的,尤其是像 Wordpress 和 Drupal 这样成熟且成熟的系统。据我所知,它们都有自己的多字节函数包装器。

其他可能有趣的资源:

【讨论】:

    【解决方案2】:

    对于多字节字符串函数,你应该检查Multibyte String Functions

    例如,有一个 mb_strlen 函数 -- 等效于 strlen,但它适用于 UTF-8

    不幸的是,这些函数中只有几个,而且所有str* 不一定都有mb_str* 等价物...不过,绝对有可能在 PHP 中创建一个 100% UTF-8 的网站5.x

    【讨论】:

      【解决方案3】:

      我在 PHP 5 中为此创建了一个包装类(IMO,这是唯一可靠的方法),以下是我对您提到的函数的一些实现:

      function iki_String_str_word_count($string, $format = 0, $search = null)
      {
          $result = iki()->Regex->Match_All($string, '[\p{L}\p{Mn}\p{Pd}\'\x{2019}' . iki()->Regex->Quote($search) . ']+', 0, 'u');
      
          if ($format == 0)
          {
              return count($result);
          }
      
          return $result;
      }
      
      function iki_String_strlen($string)
      {
          return strlen(utf8_decode($string));
      }
      

      还有一个open-source project @ SourceForge called PHP UTF-8 实现了很多str_* 系列函数。 Kohana PHP Framework 还声称 100% 兼容 UTF-8。

      【讨论】:

      • PS:见谅我的具体方法,但我赶时间,暂时无法翻译代码。希望它足以传递信息。
      【解决方案4】:

      按照您的建议,您可以创建一个包装库,直到 PHP 6 成为标准安装。 (考虑到 ISP 采用 PHP 5 的速度,这还需要几年时间。

      mb_string functions 方式同时被证明是足够的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 2011-12-07
        • 1970-01-01
        • 2011-02-22
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多