【问题标题】:UTF-8 encoded html pages show � (questions marks) instead of charactersUTF-8 编码的 html 页面显示 �(问号)而不是字符
【发布时间】:2011-07-23 15:23:27
【问题描述】:

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

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

  • 我的页面是使用 utf-8 保存的(没有 BOM,我认为
    //更新:事实证明并非如此。该文件实际上是用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" />
  • 为了测试我设置了使用 php header('Content-Type:text/html; charset=UTF-8');

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

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

怎么会?我很困惑。我会预料到完全相反的行为。
欢迎任何建议,谢谢!

编辑: 希望这会有所帮助。这是响应标头(根据萤火虫)

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

【问题讨论】:

    标签: php html character-encoding xampp special-characters


    【解决方案1】:

    检查您的任何打印一些文本的.php 文件是否也在utf-8 中正确编码。

    【讨论】:

    • 我不确定我是否理解正确,但一个简单的echo(é); 也会输出为那个该死的问号。我用标题信息更新了我的答案。
    • 我的意思是,当你有一个基本的 php 文件 (utf-8) 并包含到它的其他一些没有良好编码的 php 文件中时
    • 啊!好的,目前这是最简单的情况:一个带有简单回显的 php 和一些带有包含这些字符的文本的基本 html 标记。我还没有包括任何东西。除了提到的编码选项之外,就是。
    • 有时您正在获取 .csv 文件,而文件本身的编码是错误的。打开 .csv 或任何基于文本的数据文件,选择适当的编码(Textmate 2 在打开时具有预览模式)并使用“另存为...”来制作副本,选择“UTF-8”作为编码。那么问题应该在 php 5.3 及更高版本上消失。
    【解决方案2】:

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

    charset=ISO-8859-1
    

    数据与é,ãç 一致...有时我必须使用它的代码放置 html 的文本,例如:

    Olá
    

    给我

    Olá
    

    您可以在此页面中找到代码:http://www.ascii.cl/htmlcodes.htm

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

    【讨论】:

    • 感谢您的回答!我想找到一种不对字符进行编码的方法。我想使用 utf-8,因为我读到它包含所有可能的字符......我可以通过切换到 ISO-8859 来解决这个问题,但我希望对此有所了解。
    • 从最简单的配置重新开始,但不要开始使用 html 转义字符。
    【解决方案3】:

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

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

    【讨论】:

    • 没错!您是在告诉服务器说“charset=utf-8”实际上并非如此。服务器和浏览器是信任的生物。服务器会说出你告诉它的任何内容,并且浏览器会相信服务器对编码所说的任何内容——即使它不是真的。
    • 至于 where 非 utf-8 数据的来源,无法从您在此处发布的内容中判断。如果一个简单的 'echo("föö");" 显示为 f��,这可能表明您的 .php 文件保存为 iso-8859-1。如果从数据库中获取数据,您可以使用 mb_detect_encoding( ) 来验证其编码。
    • 你在正确的地方,并指出了真正的罪魁祸首。谢谢!看来文件没有保存为 utf-8 我不得不回到创建它的环境。在那里,隐藏在“项目设置”下的是一个设置为“ISO-8859-1”的选项。将此选项更改为“UTF-8”并再次保存文件让我得到了想要的结果。无需设置header(); 也无需修改 apaches 配置或 .htaccess。一个愚蠢的错误,真的。既烦人又令人欣慰。感谢 Sherm 的回答和 cmets!
    • @ShermPendley :你能看看this,OP 能够在 IE 中正确获取字符,但在 Chrome 和 Firefox 中都没有。
    【解决方案4】:

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

    在我的情况下,我在/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
    

    希望对你有帮助。

    【讨论】:

    • 他已经这样做了——这是上面项目符号列表中的第二项。无论如何它也无济于事;如果您发送的是 ISO-8859-1,那么在 HTTP 标头中指定“charset=utf-8”只会混淆浏览器,导致它显示那些。
    【解决方案5】:

    好像没人提到

    SET NAMES utf8;
    

    我找到了这个解决方案here,它帮助了我。如何申请:

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

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

    【讨论】:

    • 感谢您的信息,抱歉回复晚了。我一直使用 mysql_set_charset() 但是有一个项目我必须进行调整,并且由于某种原因这个函数不起作用。我尝试了各种其他方法(甚至在我的本地机器上修改了 httpd.conf 和 php.ini),但只有 SET NAMES utf8 帮助了我。顺便说一句,现在不鼓励使用 mysql_set_charset():php.net/manual/en/function.mysql-set-charset.php
    • 是的,它依赖于 MySQL 和 PHP 版本,所以这从来没有像今天这样直截了当。幸运的是,情况确实有所改善。
    • 这对我帮助很大。我为此苦苦挣扎了好几天。
    【解决方案6】:

    最初告诉 PDO 你的 charset.... 类似

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

    注意:charset=utf8; 部分。

    希望对你有帮助!

    【讨论】:

      【解决方案7】:

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

      所以对于 MySQLi 我做了:

       mysqli_set_charset($dblink, "utf8");    
      

      更多信息请见http://php.net/manual/en/mysqli.set-charset.php

      【讨论】:

      • 你的男人,这对我来说终于奏效了。谢谢兄弟!
      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2011-08-03
      • 2015-06-04
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多