我知道这个问题一直以一种或另一种形式出现,但是我对如何解决这个问题有些困惑。我有一个运行MySQL的PHP网站,该网站显示一些扩展字符为乱码。据我所知,从内容导入到在屏幕上显示的每一步,所有代码均编码为UTF-8。尽管如此,它仍然显示出奇怪的编码问题。这是第一个测试示例(NaturalPhënåm¥na,这是有目的的),mb_detect_encoding标识为UTF-8,我只能使用utf8_decode正确显示它:no utf8_decode: Natural PhënÃ¥mÂ¥na
utf8_decode: Natural Phënåm¥na
第二个示例,它甚至从来都无法正确utf8_decodes(应该是ümlaut和“ typographer的引号”(作为测试目的,故意添加了扩展字符:no utf8_decode: This pürson from “Vancouver, Canadaâ€
utf8_decode: This pürson from �??Vancouver, Canada�?�
我最初的想法是它是双重编码的,但是我不认为这是怎么回事。当我在命令行中执行查询时,MySQL中的所有内容均正确显示。
这里是我调查过的所有内容的摘要:已验证导入的内容为UTF-8,通过与MySQL的UTF-8连接导入
[MySQL数据库,表,列为UTF-8,utf_unicode _ *
在Amazon RDS上,MySQL中的character_set_client等变量设置为utf8
PHP PDO连接为UTF-8,NAME设置为UTF-8
PHP标头字符集和HTML元字符集均为UTF-8
mb_detect_encoding为两个字符串都返回UTF-8
因此,经过数小时的故障排除后,我有点不知所措。一时兴起,我什至尝试将HTML标头/元和PHP标头设置为ISO-8559-1,但这也没有解决问题。
我上一次与Amazon RDS作战是为了设置正确的变量,但否则我就没主意了。mysql> show variables like '%character%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.5.40.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
所以我想知道,我缺少步骤吗?有明显的东西吗?预先感谢。
UPDATE
这是我的PHP输出脚本,用于进一步澄清我提到的“输出”:<?php header("Content-type: text/html; charset=utf-8"); ?>
My testtry {
$dbh = new PDO("mysql:host=localhost;dbname=database",
"user", "password", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch(PDOException $e) {
echo $e->getMessage();
}
$sth = $dbh->prepare("my select statement");
$sth->execute();
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo mb_detect_encoding($row['name']);
echo "
no utf8 decode: ". $row['name'] . "
\n";
echo "single utf8 decode: ". utf8_decode($row['name']) . "
\n";
echo "no utf8 decode: ". $row['description'] . "
\n";
echo "single utf8 decode: ". (utf8_decode($row['description'])) . "
\n";
}
?>
UPDATE#2我还尝试过直接将这些相同的字符从PHP回显和直接的静态HTML输出到浏览器中,并且这些字符显示得很好。echo "“test ü ö”
"; ?>
“test ü ö”