【问题标题】:Proper character encoding to display "”"?显示“—的正确字符编码?
【发布时间】:2011-09-19 04:20:36
【问题描述】:

我遇到了一些我无法弄清楚的令人讨厌的字符编码问题。

基本上,我正在使用 PHP 从网站上抓取一些 HTML,然后通过 PHP 的 DOMDocument 运行它以更改一些 URL 等,完成后,它会输出带有一些奇怪内容的 HTML。例如:应该有结束引号的地方,它会输出”

我将页面的字符集元标记设置为utf-8,但随后” 字符在网站上显示为â€。我不确定是我不懂字符编码还是什么。

关于解决此问题的最佳方法有什么建议吗?带有元标记的客户端,或某种服务器端 PHP 转换?

【问题讨论】:

  • 请显示用于加载 HTML 页面的代码。 DOMDocument 不检测编码本身。在您的情况下,$dom = new DOMDocument('1.0', 'utf-8'); 可能会有所帮助。或者一些other workaround.
  • 原始字符是 U+201D RIGHT DOUBLE QUOTATION MARK (),在 UTF-8 中编码为“\xE2\x80\x9D”,被误解为 Latin-1,并且错误的 HTML-编码。
  • 我实际上发现了问题所在。我通过两个不同的 DOM 实例运行它,当我将它从一个导出到第二个时,它变得一团糟。重新安排我的代码只使用一个 DOM 实例,它解决了问题。
  • Zend 开发者 --- new Zend_Mail("utf-8")

标签: php utf-8 character-encoding screen-scraping domdocument


【解决方案1】:

有时在 HTML 中设置字符集或响应标头是不够的。如果您的服务器上没有为 UTF-8 设置所有内容,则您的文本可能会在途中的某个地方被错误地转换。您可能需要在 Apache 和 PHP 的配置文件中启用 UTF-8 编码。 (如果您不使用 Apache,请尝试跳过该步骤。)

Apache UTF-8 设置:

编辑您的 charset.conf(理想)或 httpd.conf 文件,将这一行添加到末尾:

AddDefaultCharset utf-8

(如果您无权访问 Apache 的配置文件,您可以使用相同的代码在 HTML 的根目录中创建一个“.htaccess”文件。)

PHP UTF-8 设置:

编辑您的 php.ini 文件,搜索“default_charset”,并将其更改为:

default_charset = "utf-8"

重启 Apache:

根据您的服务器类型,此命令可能会通过命令行来解决问题:

sudo service apache2 restart

【讨论】:

    【解决方案2】:

    我认为您应该链接/发布您遇到问题的页面(部分)以及您的一些代码以获得更好的反馈。

    一些建议:尝试将您获得的页面字符串从其元标记中指定的编码(或真实文档编码,如果不是这种情况)转换为 UTF-8 和/或在 DOMDocument 对象中强制文档编码(如 ~mario 所述或使用属性),因为 DOMDocument 似乎只有在 HTML 头标记中的第一件事是正确使用编码元标记时。

    您也可以尝试禁用 entities conversion 或其他一些属性,因为您不需要它来进行简单的 URL 更改。

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 2012-07-12
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多