为什么DOM会改变编码?

时间:2010-02-10 12:58:16

标签: php dom utf-8

$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,我确定是。

提前致谢:)

4 个答案:

答案 0 :(得分:40)

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

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

答案 1 :(得分:4)

如果肯定是DOM搞砸了编码,这个技巧对我来说反过来了一段时间(接受ISO-8859-1数据)。默认情况下,DOMDocument 默认为UTF-8,但你仍然可以尝试:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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