【问题标题】:Browser displays � instead of ´浏览器显示�而不是´
【发布时间】:2011-05-04 22:46:44
【问题描述】:

我有一个 PHP 文件,其中包含以下文本:

<div class="small_italic">This is what you´ll use</div>

在一台服务器上,它显示为:

This is what you´ll use

在另一个方面,如:

This is what you�ll use

为什么会有区别,我可以做些什么来使它正确显示(作为撇号)?


所有注意事项(供将来参考)

我实现了 Gordon 的 / Gumbo 的建议,只是我在服务器级别而不是应用程序级别上实现了它。请注意,(a) 我必须重新启动 Apache 服务器,更重要的是,(b) 我必须用正确编码的更正数据替换现有的“坏数据”。

/etc/php.ini

default_charset = "iso-8859-1"

【问题讨论】:

  • 对我来说似乎是一个编码问题。无论如何,你为什么不像其他人一样使用' 而不是´ 呢? :D
  • 检查返回文档的字符集(标题)可能有解释,无论如何你可以使用&amp;#8217;
  • 我会补充:这闻起来像 Word 复制/粘贴
  • 它不是 ASCII 撇号 x'27'。它可能是仅在 MS 代码页中受支持的 Windows“左单引号”x'92'。
  • 除了针对这个问题的具体建议之外,如果您还没有阅读 Joel Spolsky 的 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),我始终建议您阅读:)

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


【解决方案1】:

您必须确保使用正确的字符集提供内容:

要么发送带有header 的内容,其中包括

<?php header("Content-Type: text/html; charset=[your charset]"); ?>

或 - 如果 HTTP charset 标头不存在 - 将 &lt;META&gt; element 插入 &lt;head&gt;

<meta http-equiv="Content-Type" content="text/html; charset=[your charset]" />

就像属性名称所暗示的那样,http-equiv 相当于 HTTP 响应标头,如果未设置相应的 HTTP 标头,用户代理应该使用它们。

就像 Hannes 在 cmets 中已经针对该问题提出的建议一样,您可以查看网络服务器返回的标头以了解它所服务的编码。两台服务器之间可能存在差异。因此,将上面的[your charset] 部分更改为“工作”服务器的部分。

有关原因的更详细解释,see Gumbo's answer

【讨论】:

  • 你怎么知道他的文档是UTF-8的?
  • 更重要的是:数据似乎没有以 UTF-8 编码。
  • @Gordon:我更希望看到 proper order 中的建议:首先是 HTTP,然后是 HTML(并且只有在 HTTP 中没有指定编码的情况下)。
  • @Gumbo 好的,改变了顺序,虽然我很确定拥有 META 并没有什么坏处。它被称为 http-equiv 是有原因的。当没有等效的 http 标头时,用户代理应该使用它。
  • @Gordon:是的,如果在 HTTP 中指定了字符编码,则 META 根本不应该有任何影响。这就是为什么 META 在某些情况下不足的原因。
【解决方案2】:

将浏览器的字符集设置为定义的值:

例如,

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

【讨论】:

    【解决方案3】:
    1. 在根目录下创建.htaccess文件:

      AddDefaultCharset utf-8
      AddCharset utf-8 *
      <IfModule mod_charset.c>
          CharsetSourceEnc utf-8
          CharsetDefault utf-8
      </IfModule>
      
    2. &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;

    【讨论】:

      【解决方案4】:

      REPLACEMENT CHARACTER (U+FFFD) 的显示很可能意味着您的 specifying your output 是 Unicode,但您的数据不是。

      在这种情况下,如果 ACUTE ACCENT ´ 例如使用 ISO 8859-1 编码,则它使用字节序列 0xB4 编码,因为这是 ISO 8859-1 中该字符的代码点.但是该字节序列在 UTF-8 等 Unicode 编码中是非法的。在这种情况下,会显示替换字符 U+FFFD。

      因此,要解决此问题,请确保您是 specifying the character encoding properly,根据您的实际情况(反之亦然)。

      【讨论】:

        【解决方案5】:

        这可能是由于您插入页面的数据与页面本身的字符编码不同(最常见的迭代是拉丁语 1 和另一个 UTF-8)。

        检查用于页面和数据库的编码。可能会出现不匹配。

        【讨论】:

          【解决方案6】:

          简单的解决方案是对特殊字符使用 ASCII 码。

          撇号字符在 ASCII 中的值为&amp;#8217;。尝试将此值放入您的 HTML 中,它应该适合您。

          【讨论】:

          • ASCII 只有一个撇号字符,位于 0x27。字符引用&amp;#8217; 指的是Unicode 中的字符U+2019 右单引号
          • @Gumbo:右单引号撇号的正确字符:languagegeek.com/typography/apostrophes.html
          • 我认为他的意思是 &amp;#8217; 是一个纯 ascii 字符串,而不是它所代表的字符是 ascii。
          • @RoToRa:我想指出的是 US-ASCII 只有一个撇号字符,而字符引用指的是 Unicode 中的字符。除此之外,U+2019 并不是每种语言中正确的印刷撇号。但是,是的,它适用于英语。
          【解决方案7】:

          总结一下:

          1. 确保保存在 Web 服务器上的 FILE 具有正确的编码
          2. 确保 Web 服务器也使用正确的编码提供它
          3. 确保 HTML 元标记设置为正确的编码
          4. 确保使用“标准”特殊字符,即使用 ' 而不是 ´,因为您想编写类似“Luke Skywalker 的代码”之类的内容

          对于编码,UTF-8 可能对你有好处。

          如果此答案有帮助,请标记为正确或投票。谢了

          【讨论】:

            猜你喜欢
            • 2012-03-27
            • 1970-01-01
            • 1970-01-01
            • 2012-01-18
            • 2021-12-29
            • 2020-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多