UTF-8 编码的 html 页面显示(问号)而不是字符

我在win7(x64)上有标准的XAMPP安装。在过去的一个项目中,mysql编码与php enconding不匹配,而php enconding有时会以其他编码输出html,因此我决定使用utf-8始终如一地编码所有内容。

我刚刚开始使用html标记,并且已经准备好遇到麻烦。

  • 我的页面是使用utf-8保存的(我认为没有BOM)
    //update:事实证明情况并非如此。该文件实际上是使用ISO_8859-1保存的。后来我发现这一点要感谢Sherm Pendleys的答案。我不得不返回并将我的项目设置(设置为“ISO-8859-1”)更改为所需的“UTF-8”。
  • php 设置为按照 .htaccess 以 utf-8 的形式提供.php页面,其中包含:AddCharset UTF-8 .php
  • html 有一个元标记,指定:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • 为了测试我设置了用过的phpheader('Content-Type:text/html; charset=UTF-8');

该页面显然是以utf-8格式提供的(firefox和chrome可以识别它),但任何特殊字符,例如,或将仅显示为。同样在查看源代码时。éá¡

删除上面提到的编码设置时,所有字符都会正确呈现,但检测到的编码会显示或取决于浏览器。windows-1252ISO-8859-1

怎么会这样?我很困惑。我本来以为会完全相反的行为。
欢迎任何建议,谢谢!

编辑:希望这能提供更多帮助。这是响应标头(根据 firebug)

HTTP/1.1 200 OK
Date: Sat, 26 Mar 2011 20:49:44 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 91
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

答案 1

当[删除]上面提到的编码设置时,所有字符[都正确呈现],但检测到的编码显示windows-1252或ISO-8859-1,具体取决于浏览器。

然后,这就是您真正发送的内容。项目符号列表中的任何编码设置都不会以任何方式实际修改输出;他们所做的就是告诉浏览器在解释您发送的内容时要采用什么编码。这就是为什么你得到这些 - 你告诉浏览器你发送的是UTF-8,但它实际上是ISO-8859-1。


答案 2

在我的情况下,数据库返回,当我的浏览器预期.latin1utf8

因此,对于MySQLi,我做到了:

 mysqli_set_charset($dblink, "utf8");    

有关详细信息,请参阅 http://php.net/manual/en/mysqli.set-charset.php


推荐