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

Php UTF-8编码的html页面显示࿽;(问号)而不是字符,php,html,character-encoding,xampp,special-characters,Php,Html,Character Encoding,Xampp,Special Characters,我在win7(x64)上安装了标准XAMPP。 在过去的一个项目中,mysql编码与php编码不匹配,php编码有时会在其他编码中输出html,我也有过同样的编码问题,因此我决定使用utf-8对所有内容进行一致编码 我刚刚开始使用html标记,我已经准备好遇到麻烦了 我的页面使用utf-8保存(我想没有BOM) //更新:事实证明并非如此。该文件实际上是用ISO_8859-1保存的。多亏了Sherm Pendley的回答,我后来发现了这一点。我必须返回并将我的项目设置(设置为“ISO-8859

我在win7(x64)上安装了标准XAMPP。 在过去的一个项目中,mysql编码与php编码不匹配,php编码有时会在其他编码中输出html,我也有过同样的编码问题,因此我决定使用utf-8对所有内容进行一致编码

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

  • 我的页面使用utf-8保存(我想没有BOM)
    //更新:事实证明并非如此。该文件实际上是用
    ISO_8859-1
    保存的。多亏了Sherm Pendley的回答,我后来发现了这一点。我必须返回并将我的项目设置(设置为“ISO-8859-1”)更改为所需的“UTF-8”
  • php根据.htaccess设置为在utf-8中服务.php页面,并带有:
    AddCharset utf-8.php
  • html有一个元标记,指定:
  • 为了测试,我使用php
    header('Content-Type:text/html;charset=UTF-8')
该页面显然是以utf-8格式提供的(firefox和chrome都承认它是utf-8格式),但任何特殊字符,如
é
á
都将显示为
。查看源代码时也是如此

删除上述编码设置时,所有字符均正确呈现,但检测到的编码显示为
windows-1252
ISO-8859-1
,具体取决于浏览器

为什么?我很困惑。我本以为会有完全相反的行为。
欢迎任何建议,谢谢

编辑: 希望这能起到更多的作用。这是响应标题(根据firebug)


检查打印某些文本的
.php
文件是否在
utf-8
中正确编码

我来自巴西,我使用
latin1\u spanish\u ci
创建数据库。对于html和我使用的所有其他内容:

charset=ISO-8859-1
数据与
é
ã
ç
匹配。。。有时我不得不使用html的代码来放置html的文本,例如:

Olá
给我

Olá
您可以在此页面中找到代码:

希望这有帮助。我记得那真的很烦人

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


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

问题在于apache用于服务页面的字符集。我使用Linux,所以我对XAMPP一无所知。我也遇到了同样的问题,我解决这个问题的方法是将字符集添加到
charset
config文件中(默认情况下会对其进行注释)

在我的例子中,它位于
/etc/apache2/conf.d/charset
中,但由于您使用的是Windows,所以位置不同。所以我给你一个如何解决这个问题的想法

最后,我的字符集配置文件如下所示:

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

AddDefaultCharset UTF-8

我希望有帮助。

看起来没人提到过

SET NAMES utf8;
我找到了这个解决方案,它帮助了我。如何应用它:

要完全使用UTF-8,请在连接到数据库服务器后立即发出以下语句: 设置名称utf8


也许这会对某人有所帮助。

首先告诉PDO您的
字符集。
。。。。差不多

PDO("mysql:host=$host;dbname=$DB_name;charset=utf8;", $username, $password);
注意:
charset=utf8零件


希望有帮助

在我的例子中,数据库返回了
latin1
,而我的浏览器期望
utf8

所以对于MySQLi,我做到了:

 mysqli_set_charset($dblink, "utf8");    

有关更多信息,请参见

我不确定自己是否理解正确,但是一个简单的
echo(é)也输出为那个该死的问号。我用标题信息更新了我的答案。我的意思是,当你有一个基本的php文件(utf-8)并且没有很好的编码就包含到它的其他php文件中时!好的,现在这是最简单的例子:一个带有简单回音的php和一些包含这些字符的文本的基本html标记。我还没有包括任何东西。除了上面提到的编码选项之外,也就是说,有时候你正在获取一个.csv文件,而文件本身的编码是错误的。打开.csv或任何基于文本的数据文件,选择适当的编码(Textmate 2在打开时具有预览模式)并使用“另存为…”创建副本,选择“UTF-8”作为编码。那么问题应该在PHP5.3及以上版本中解决。谢谢你的回答!我想找到一种不编码字符的方法。我想到使用utf-8,因为我读到它包含了所有可能的字符。。。我可以通过切换到ISO-8859来解决这个问题,但我更希望对此有所了解。用尽可能最简单的配置重新开始,但不要开始用html转义字符。完全正确!您告诉服务器说“charset=utf-8”,事实并非如此。服务器和浏览器是信任的生物。无论你告诉它什么,服务器都会说什么,浏览器也会相信服务器对编码所说的任何话——即使这不是真的。至于非utf-8数据来自何处,无法从你在这里发布的内容中分辨出来。如果一个简单的“回声”(“fö”);“显示为f��, 这可能表明你的.php文件保存为iso-8859-1。如果数据是从数据库中提取的,你可以使用mb_detect_encoding()来验证其编码。你说得对,并向我指出了真正的罪魁祸首。谢谢!似乎该文件未保存为utf-8,我必须返回创建它的环境。在那里,隐藏在““项目设置”是一个
 mysqli_set_charset($dblink, "utf8");