代码之家  ›  专栏  ›  技术社区  ›  Rik Heywood

如何最好地配置PHP来处理UTF-8网站

  •  17
  • Rik Heywood  · 技术社区  · 15 年前

    您推荐什么扩展,以及如何最好地配置PHP来创建一个使用UTF-8编码的网站。如。。。

    • 页面输出为UTF-8
    • 表单提交以UTF-8编码的数据
    • 字符串数据的内部处理(如与数据库交谈时)也都是UTF-8格式。

    目前,PHP似乎不能很好地处理多字节字符集。到目前为止,我已经知道了 mbstring 看起来是一个重要的扩展。

    这值得麻烦吗?

    6 回复  |  直到 6 年前
        1
  •  49
  •   djn    15 年前

    PHP与Unicode内容的假定问题被夸大了。我从1998年开始做多语种的网站,直到我在某个地方读到这篇文章——很多年之后,我才知道可能会有什么问题。

    这对我来说很好:

    Apache配置(在httpd.conf或.htaccess中)

    AddDefaultCharset utf-8
    

    php(在php.ini中)

    default_charset = "utf-8"
    mbstring.internal_encoding=utf-8
    mbstring.http_output=UTF-8
    mbstring.encoding_translation=On
    mbstring.func_overload=6 
    

    MySQL

    CREATE 您的数据库 utf8_* 校对, 让表继承数据库排序规则并 开始每个连接 "SET NAMES utf8"

    HTML(在head元素中)

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    
        2
  •  3
  •   Nono    7 年前

    我也面临同样的问题 UTF-8 characters ,一切都在实时服务器和临时服务器上工作,但有时它在我的开发人员计算机上崩溃了。这种行为很奇怪,有时字符被正确编码,但在随机页面重新加载时,它开始使用 Diamond Charters '���เห็นอเวิลด์!���' Question mark '??�เห็นอเวิลด์!???' 或85%的数据呈现正常 'เห็นอเวิลด์!?��' 但剩下的15%显示了不匹配的字符。我想解决这个问题。所以,从我的清单开始

    1-检查HTML中是否添加了字符头


    2-检查mysql表中数据是否保存正确


    3-检查mysql是否有合适的utf-8编码设置


    4-检查Apache是否有处理utf-8字符集的设置


    5-检查简单php是否可以回音“_____”输出与输入“_____”相同。


    6-检查PHP是否发送正确的头输出


    7-检查mysql查询是否得到相同的数据“_____”


    8-检查“_____”是否有HTML字符,正确处理。


    9-检查“_____”是否通过任何HTML编码解码功能


    10-检查.htaccess是否设置为处理utf-8字符集


    查看上面的所有列表,找出哪里有东西……坏掉了。

    试一试(我正在使用代码点火器):

    =================================
    :: PHP ini Settings::
    =================================
    
    default_charset = "utf-8"
    mbstring.internal_encoding=utf-8
    mbstring.http_output=UTF-8
    mbstring.encoding_translation=On
    mbstring.func_overload=6 
    
    =================================
    :: .htaccess Settings::
    =================================
    
    DefaultLanguage en-US
    AddDefaultCharset UTF-8
    
    =================================
    :: HTML Header Page::
    =================================
    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    =================================
    :: PHP Codeigniter index.php ::
    =================================
    
    header('Content-Type: text/html; charset=UTF-8');
    
    =================================
    :: Codeigniter config.php ::
    =================================
    
    $config['charset'] = 'UTF-8';
    
    =================================
    :: Codeigniter database.php ::
    =================================
    
    $db['default']['char_set'] = 'utf8';
    $db['default']['dbcollat'] = 'utf8_general_ci';
    
    =================================
    :: Codeigniter helper function (optional)
    =================================
    
    if(!function_exists('safe_utf_string')){
        function safe_utf_string($utf8string= ''){
            $utf8string = htmlspecialchars($utf8string, ENT_QUOTES, 'UTF-8');
            return mb_convert_encoding($utf8string, 'UTF-8');
        }
    }
    

    最后别忘了说声谢谢!) @djn 回答

        3
  •  2
  •   Jason Aller    6 年前

    PHP警察很好!

    您应该将php.ini“default_charset”参数设置为“utf-8”。

    确保:

    <head>
      <meta http-equiv="Content-Type"
        content="text/html; charset=utf-8"
        />
    

    在你服务的每一页的顶部。

    有几个问题领域:

    数据库——确保在默认情况下将它们配置为使用UTF-8,或者输入一个痛苦的世界。

    IDES/编辑器——很多编辑器不支持UTF-8。我通常使用VIM,但它从来都不是大问题。

    文档——只是花了一个下午的时间让PHP从电子表格中读取泰文字符。我最终成功了,但仍然不确定我做的对。

        4
  •  1
  •   RSeidelsohn    15 年前

    如果mb string还不是php包的一部分,那么我肯定会向您推荐它-您甚至想使用它来计算表单输入的字符串长度(mb_strlen($string_var,'utf8')… 否则,除了有效和正确的HTML、正确的HTTP服务器配置(这样服务器就可以传递不带UTF-8格式的页面)和带UTF-8支持的文本编辑器(例如记事本+)。

        5
  •  1
  •   Tapper Pascal MARTIN    12 年前

    在php.ini中,设置

    mbstring.internal_encoding = UTF-8
    mbstring.encoding_translation = On
    

    这样就不需要每次都将编码参数传递给mb_u函数。

        6
  •  0
  •   MarcoZen    6 年前

    2018更新::

    请注意,这些php.ini条目已被弃用;

    ;mbstring.internal_encoding = utf-8
    ;mbstring.http_input =
    ;mbstring.http_output = utf-8
    

    设置默认字符集就足够了。

     default_charset = "UTF-8"