【问题标题】:How to best configure PHP to handle a UTF-8 website [duplicate]如何最好地配置 PHP 来处理 UTF-8 网站 [重复]
【发布时间】:2010-12-09 00:16:24
【问题描述】:

您会推荐哪些扩展以及如何最好地配置 php 以创建一个对所有内容都使用 utf-8 编码的网站。比如……

  • 页面输出为 utf-8
  • 表单提交以 utf-8 编码的数据
  • 字符串数据的内部处理(例如与数据库通信时)也都使用 utf-8。

目前看来 php 并不能很好地处理多字节字符集。到目前为止,我发现mbstring 看起来像是一个重要的扩展。

这值得麻烦吗..?

【问题讨论】:

  • 自 4.1.x 以来,我已经成功地使用标准 PHP 安装和 UTF-8 源文件生成 UTF-8 输出,包括特殊的 UTF-8 字符,如 ♕ ⚐ 和 ✔。 :)
  • 获得正确的 UTF-8 输出并不能证明您的代码正确解析 输入 并防止恶意序列。
  • 更新 在整个问答环节中,请考虑在 MySQL 中使用 utf8mb4 而不是 utf8。 (对比一下,非 MySQL 术语 UTF-8。)

标签: php utf-8


【解决方案1】:

2018 年更新 :::

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

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

下一步...

PHP - 为以下内容设置 utf8 - 通过您的 Web 应用程序的 config.php 文件

 ini_set('default_charset', 'UTF-8');                                    
 mb_internal_encoding('UTF-8');
 iconv_set_encoding('internal_encoding', 'UTF-8');
 iconv_set_encoding('output_encoding', 'UTF-8');

MariaDB / MySQL - 通过以下方式设置 utf8:

 mysqli::set_charset ( "utf8mb4" );

HTML 页面 - 设置方式:

 <meta charset="utf-8" > 

【讨论】:

    【解决方案2】:

    php 应付得很好!

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

    确保:-

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

    位于您提供的每个页面的顶部。

    有几个问题领域:

    数据库——确保它们被配置为默认使用 utf-8 或进入一个痛苦的世界。

    IDE/编辑器——很多编辑器不能很好地支持 utf-8。我通常使用 vim,但它从来都不是一个大问题。

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

    【讨论】:

      【解决方案3】:

      我在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 是否发送正确的 Headers 输出


      7 - 检查 MySQL Query 是否获取相同的数据“เห็นอเวิลด์”


      8 - 检查“เห็นอเวิลด์”是否有一些html字符,妥善处理


      9 - 检查“เห็นอเวิลด์”是否通过任何 html 编码解码函数


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


      检查以上所有列表以找出某些东西..破坏的位置。

      试一试(我正在使用 Codeigniter):

      =================================
      :: 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 回答

      【讨论】:

      • 在 MySQL 中你可能需要utf8mb4 而不是utf8。你能提供变成黑钻石的角色的十六进制吗?或者他们应该在那里的角色?当hex为4字节时:F0xxyyzz,utf8就不行了; utf8mb4 是必需的。
      【解决方案4】:

      在你的 php.ini 中,设置

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

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

      【讨论】:

        【解决方案5】:

        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">
        

        【讨论】:

        • “SET NAMES utf8”SQL语句究竟做了什么?
        • 直接来自 MySQL 文档:“ SET NAMES 'x' 语句等同于这三个语句:SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;”这很方便,因为无论您使用哪个字符集来存储数据,数据仍然必须往返于 PHP。在使用单台计算机时可能永远不会注意到问题(如 HTML FORM -> MySQL -> 页面),但是使用开发机器填充数据库并将其移动到产品服务器以输出它是有风险的,因为两者可能有不同的客户端字符集。 SET NAMES 意味着可移植性。
        • 你还能使用 PHP 的字符串函数还是必须使用 mb_ 的函数?
        • 这是我创建数据库的方式:CREATE DATABASE &lt;DBNAME&gt; CHARACTER SET utf8 COLLATE utf8_general_ci;
        • 不要使用 set names,因为它不会更新用于 real_escape_string 的字符集。见stackoverflow.com/questions/1317152/…
        【解决方案6】:

        如果 mbstring 还不是你的 PHP 包的一部分,那么我肯定会向你推荐它——你甚至会想用它来计算字符串长度( mb_strlen($string_var, 'utf8') )以进行表单输入... 否则,除了有效且正确的 HTML、正确的 http-server-config(因此服务器将提供不使用 utf-8 的页面)和支持 utf-8 的文本编辑器(例如 Notepad++)之外,您不需要任何东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-28
          • 2012-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-03
          相关资源
          最近更新 更多