【问题标题】:PHP + MySQL encoding issues for Portuguese (PT-Br)葡萄牙语的 PHP + MySQL 编码问题 (PT-Br)
【发布时间】:2010-07-17 21:47:32
【问题描述】:

我正在开发一个巴西葡萄牙语网站,但遇到了一些非常烦人的编码问题。

应该这样写的词:óbito 正在这样写:“bito”

我注意到虽然文本仍在数据库中,但它们还可以。但是当我在 PHP 中使用echo 时,就会出现编码问题。

我已经做过但没有帮助的事情清单:

1- 设置 PHP 文件保存为 UTF-8

2- 我正在使用这个元标记<meta http-equiv="content-type" content="text/html; charset=utf-8" />

3- 我使用了这个 SQL 查询:

CREATE DATABASE db_name
    CHARACTER SET utf8
    DEFAULT CHARACTER SET utf8
    COLLATE utf8_general_ci
    DEFAULT COLLATE utf8_general_ci
    ;

ALTER DATABASE db_name
    CHARACTER SET utf8
    DEFAULT CHARACTER SET utf8
    COLLATE utf8_general_ci
    DEFAULT COLLATE utf8_general_ci
    ;

ALTER TABLE tbl_name
    DEFAULT CHARACTER SET utf8
    COLLATE utf8_general_ci
    ;

【问题讨论】:

  • @Aircule: 的存在是一个很好的迹象,表明它已经被解释为 UTF-8。因为该字符用于表示损坏的字节序列。
  • 如果您将浏览器的编码更改为 ISO-8859-1(Latin 1 aka Western)会怎样?
  • @Gumbo 结果是 5265636F6D70656E7361206D65726563696461 , 4156414C4F4E2048494748 和类似的东西。 @Aircule 当我更改为 ISO-8895-1 时,这些 没有问题。但是出现了这个问题:*.com/questions/3242762/i-enconding-issue
  • 这些结果没有告诉我们任何信息,因为它们来自仅具有常规 ASCII 字符的字符串(其中 ISO-8859-1 的编码与 UTF-8 相同)。尝试转储包含重音字符的字符串(即:óbito)
  • @Rafael Carvalho:好吧,在这种情况下,数据似乎是正确的。那我猜你的会话/连接设置是错误的。尝试执行这些语句以查看当前的字符集/排序规则设置:SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';

标签: php mysql utf-8 character-encoding


【解决方案1】:

不要试图重新发明*,保持简单: 选择数据库后只需使用以下行:

mysql_query("SET NAMES 'utf8'") OR die(mysql_error()); 

【讨论】:

    【解决方案2】:

    您可以使用此函数更改字符集:

    $q = mysql_set_charset('utf8');
    var_dump($q);
    

    (如果函数返回 true 则表示成功)。这应该可以解决您的连接问题。

    对于旧版本的 PHP,您可以使用以下内容:

    <?php
     if (function_exists('mysql_set_charset') === false) {
         /**
          * Sets the client character set.
          *
          * Note: This function requires MySQL 5.0.7 or later.
          *
          * @see http://www.php.net/mysql-set-charset
          * @param string $charset A valid character set name
          * @param resource $link_identifier The MySQL connection
          * @return TRUE on success or FALSE on failure
          */
         function mysql_set_charset($charset, $link_identifier = null)
         {
             if ($link_identifier == null) {
                 return mysql_query('SET NAMES "'.$charset.'"');
             } else {
                 return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
             }
         }
     }
     ?>
    

    似乎 PHP 默认使用 latin1,我找不到更改默认值的方法。所以我猜你每次启动新连接时都必须使用mysql_set_charset()

    Boa Sorte。

    【讨论】:

    • 我想说不是'You can',而是'you to tell mysql what encoding you are using'. 其余的都很完美。
    【解决方案3】:

    我的解决方法是:

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

    在页面的头部,除了重新创建表并将数据库的排序规则更改为utf-8编码。

    【讨论】:

      【解决方案4】:

      将此用于葡萄牙语:

      <meta http-equiv="Content-Type" content="text/html; charset=pt-BR" />
      

      【讨论】:

        【解决方案5】:
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        

        将上面的元标记放在 html/php 文档的 &lt;head&gt; 标记内。

        如果您将 MySQL 数据库与 PHP 一起使用,您还需要在主函数文件中运行此查询 mysql_query("SET NAMES 'utf8'");

        【讨论】:

          【解决方案6】:

          通过Put:数据库连接字符串后解决

          $con = mysqli_connect('localhost', 'root', 'password', 'testdb');
          if (mysqli_connect_errno()) {
              exit("Failed to connect to MySQL: " . mysqli_connect_error());
          }
          mysqli_set_charset($con, 'utf8');
          

          【讨论】: