葡萄牙语的 PHP + MySQL 编码问题 (PT-Br)

Posted

技术标签:

【中文标题】葡萄牙语的 PHP + MySQL 编码问题 (PT-Br)【英文标题】:PHP + MySQL encoding issues for Portuguese (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%'; 【参考方案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');

【讨论】:

以上是关于葡萄牙语的 PHP + MySQL 编码问题 (PT-Br)的主要内容,如果未能解决你的问题,请参考以下文章

在 mysql 或 php 中使用 utf 字符排序?最佳解决方案

Python MySQL CSV 导出到 json 奇怪的编码

如何在python中对西班牙语进行编码和解码

php mysql 编码问题

PHP+MySQL存储数据出现中文乱码的问题

PHP和MYSQL的编码问题