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

leu*_*gim 32 html php xampp character-encoding special-characters

我在win7(x64)上安装了标准的XAMPP.在过去的项目中我遇到了编码麻烦,其中mysql编码与php enconding不匹配,后者有时在其他编码中输出html,我决定使用utf-8对所有内容进行编码.

我刚刚开始使用html标记,而且我已经遇到了麻烦.

  • 我的页面使用utf-8保存(没有BOM,我认为)
    //更新:事实证明情况并非如此.该文件实际上已保存ISO_8859-1.我后来发现这一点归功于Sherm Pendleys的回答.我不得不返回并将我的项目设置(设置为"ISO-8859-1")更改为所需的"UTF-8".
  • 每个.htaccess设置php以在utf-8中提供.php-pages: AddCharset UTF-8 .php
  • html有一个元标记指定: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • 测试我设置使用的PHP header('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
Run Code Online (Sandbox Code Playgroud)

She*_*ley 23

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

那就是你真正发送的东西.子弹列表中的所有编码设置都不会以任何方式实际修改输出; 他们所做的就是告诉浏览器在解释你发送的内容时要采用什么编码.这就是为什么你得到那些 - 你告诉浏览器你发送的是UTF-8,但它确实是ISO-8859-1.

  • 究竟!你告诉服务器说"charset = utf-8"实际上并非如此.服务器和浏览器是信任的生物.服务器会说出你告诉它的任何内容,浏览器会相信服务器所说的编码 - 即使它不是真的. (5认同)
  • 你在哪里,指出我真正的罪魁祸首.谢谢!似乎文件没有保存为utf-8我必须回到它创建的环境.隐藏在"项目设置"下的是"ISO-8859-1"中设置的选项.将此选项更改为"UTF-8"并再次保存文件可以获得所需的结果.无需在apaches config或*.htaccess*中设置`header();`或修改.一个愚蠢的错误,真的.既讨厌又令人欣慰.谢谢Sherm的回答和评论! (4认同)
  • 至于*非utf-8数据的来源*,没有办法告诉你在这里发布的内容.如果一个简单的'echo("föö");"显示为f ,则表明你的.php文件保存为iso-8859-1.如果从数据库中提取数据,你可以使用mb_detect_encoding( )验证其编码. (2认同)

Den*_*nis 13

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

所以对MySQLi我做了:

 mysqli_set_charset($dblink, "utf8");    
Run Code Online (Sandbox Code Playgroud)

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


IPr*_*ory 6

检查是否有任何.php文件打印某些文本,也正确编码utf-8.


Eri*_*est 5

charset最初告诉PDO ....类似的东西

PDO("mysql:host=$host;dbname=$DB_name;charset=utf8;", $username, $password);
Run Code Online (Sandbox Code Playgroud)

请注意:charset=utf8;部分.

希望能帮助到你!