葡萄牙语的 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 文档的 <head>
标记内。
如果您将 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 字符排序?最佳解决方案