【问题标题】:Using UTF-8 charset with PHP - are mb functions required?在 PHP 中使用 UTF-8 字符集 - 是否需要 mb 函数?
【发布时间】:2009-11-16 19:55:24
【问题描述】:

在过去的几天里,我一直致力于将我的 PHP 代码库从 latin1 转换为 UTF-8。我读过两种主要的解决方案,要么用内置的多字节函数替换单字节函数,要么在 php.ini 文件中设置 mbstring.func_overload 值。

但后来我在堆栈溢出时遇到了this 线程,thomasrutter 的帖子似乎表明多字节函数对于 UTF-8 实际上不是必需的,只要脚本和字符串文字以 UTF 编码-8。

我还没有找到任何其他证据证明这是否属实,如果事实证明我不需要将我的代码转换为 mb_functions,那么这将是一个真正的节省时间!任何人都可以对此有所了解吗?

【问题讨论】:

    标签: php utf-8 multibyte-functions


    【解决方案1】:

    据我了解,只要您的所有数据 100% 采用 utf-8 格式——这意味着用户输入、数据库以及 PHP 文件本身的编码(如果其中包含特殊字符)——这是true 搜索和比较操作为true。正如@ntd 指出的那样,非多字节 strlen() 在包含多字节字符的字符串上运行时会产生错误的结果。

    THis 是一篇关于编码基础知识的精彩文章。

    【讨论】:

    • 感谢所有回复的人,我现在明白了。非常感谢!
    【解决方案2】:

    除非您使用 functions they replace 中的任何一个(并且您可能正在至少使用其中一个)或以其他方式明确需要扩展名,例如HTTP handling

    在努力实现 UTF-8 合规性时,我总是回退到 PHP UTF-8 Cheatsheet 并添加一个:需要更新 PCRE 模式以使用 u 修饰符。

    【讨论】:

      【解决方案3】:

      当您检查或修改多字节字符串时,您需要使用 mb_* 函数。一个非常简单的例子说明了原因:

      $str = "abcžđščćöçefg";
      mb_internal_encoding("UTF-8");
      
      echo "strlen: ".strlen($str)."\n";
      echo "mb_strlen: ".mb_strlen($str)."\n";
      

      打印出来:

      strlen: 20
      mb_strlen: 13
      

      【讨论】:

        【解决方案4】:

        thomasrutter 表示 搜索 不需要特殊处理。例如,如果您需要检查 UTF8 字符串的长度,我看不出如何使用纯 strlen() 来做到这一点。

        【讨论】:

          【解决方案5】:

          mb_strtoupper 之类的函数也可能是必需的。 strtoupper 不会将 á 转换为 Á。

          【讨论】:

            【解决方案6】:

            有许多函数期望字符串是单字节的(有些甚至假定它是 iso-8859-1)。在这些情况下,您需要了解自己在做什么,并可能使用替换功能。有一个相当全面的列表:http://www.phpwact.org/php/i18n/utf-8

            【讨论】:

              【解决方案7】:

              您可以使用 mbfunctions 库来扩展 PHP 中的多字节函数:

              http://code.google.com/p/mbfunctions/

              【讨论】:

                【解决方案8】:

                你可以用这个 http://php.net/manual/en/mbstring.overload.php 在 php.ini 文件中设置,所以你不需要改变你的代码。

                但是要小心,因为不是所有的字符串函数都会自动改变。 这是一个:http://php.net/manual/en/function.substr-replace.php

                【讨论】:

                • 不再是:“自 PHP 7.2.0 起,此功能已被弃用。强烈建议不要依赖此功能。”
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-06-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-14
                • 2019-07-31
                相关资源
                最近更新 更多