【问题标题】:Why Does DOM Change Encoding?为什么 DOM 会改变编码?
【发布时间】:2011-01-15 06:22:22
【问题描述】:
$string = file_get_contents('http://example.com');

if ('UTF-8' === mb_detect_encoding($string)) {
    $dom = new DOMDocument();
    // hack to preserve UTF-8 characters
    $dom->loadHTML('<?xml encoding="UTF-8">' . $string);
    $dom->preserveWhiteSpace = false;
    $dom->encoding = 'UTF-8';
    $body = $dom->getElementsByTagName('body');
    echo htmlspecialchars($body->item(0)->nodeValue);
}

这会将所有 UTF-8 字符更改为 Å、¾、¤ 和其他垃圾。有没有其他方法可以保存 UTF-8 字符?

不要发布答案告诉我确保我将其输出为 UTF-8,我确定我是。

提前致谢:)

【问题讨论】:

  • 数据($string)从何而来?
  • 我已经更新了我的问题:)
  • 您能否提供一个指向您使用 file_get_contents() 获取的 URL 的链接?正如我在另一个问题中所说,我怀疑您正在获取 ISO-8859-1 或其他一些数据,当以 UTF-8 输出时,这些数据 必须 出现乱码。我不会依赖 mb_detect_encoding()。
  • 好吧,我相信 :) 这真的很奇怪。但是,htmlspecialchars() 的默认编码是 iso-8859-1。你能把它改成UTF吗?它不应该改变任何东西,只是为了确定。 de3.php.net/htmlspecialchars

标签: php dom utf-8


【解决方案1】:

我最近遇到了类似的问题,最终找到了这个解决方法-在加载html之前将所有非ascii字符转换为html实体

$string = mb_convert_encoding($string, 'HTML-ENTITIES', "UTF-8");
$dom->loadHTML($string);

【讨论】:

  • 这是一个很好的解决方法,但是找出为什么你的生产服务器的 DOM 首先会破坏 UTF8 仍然很有趣。如果有的话,也许可以问管理员。
  • 我是管理员 :D 我不知道。我正在使用一个非常常见的 Debian 5.0 Lenny 设置。也许这是一些安全“功能”?
  • 此外,我使用的是来自官方存储库的 Debian 的默认 php5 包,所以它是默认安装和默认设置。我没有更改任何默认设置,我只是为我的应用程序添加了一些我需要的扩展,例如 ioncube、imagick、gd、curl(我认为这就是全部)。
  • @Pekka loadHtml() 对我来说也不适用于 UTF-8(仅 loadXml(),但是它不适用于文档片段 - loadXml() 需要正确格式化的文档而不是加载HTML())。我的 libxml 版本是 2.6.32(匈牙利语 Windows XP SP3)。
  • 这也适用于传递 mysql utf-8 内容以提取 php 函数。我在传递给 dompdf 的 mysql 数据时遇到问题,这就是解决方法。非常感谢!
【解决方案2】:

如果肯定是 DOM 搞砸了编码,这个技巧对我来说正好相反(接受 ISO-8859-1 数据)。在任何情况下,DOMDocument 应该默认为 UTF-8,但您仍然可以尝试:

    $dom = new DOMDocument('1.0', 'utf-8');

【讨论】:

  • 这无济于事,但 andrewmabbott 已经解决了我的问题 - 检查他的答案 ;)
【解决方案3】:

我必须添加一个 utf8 标头才能获得正确的视图:

header('Content-Type: text/html; charset=utf-8');

【讨论】:

    【解决方案4】:

    在您的 php 代码所在的脚本顶部(您在此处发布的代码),确保您发送一个 utf-8 标头。我敢打赌,您的编码现在是 latin1 的某种变体。是的,我知道远程网页是 utf8,但是这个 php 脚本不是。

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2014-06-11
      • 2014-09-29
      相关资源
      最近更新 更多