从文件加载HTML时保留utf8

时间:2011-12-01 16:16:54

标签: php encoding utf-8 domdocument

显然,PHP及其标准库存在一些问题,DOMDocument也不例外。

加载HTML字符串时,utf8字符有变通方法 - $dom->loadHTML()

显然,从文件加载HTML时我没有办法做到这一点 - $dom->loadHTMLFile()。虽然它从<meta />标签读取和设置编码,但如果我没有定义那些问题,则会出现问题。例如,在加载HTML片段(模板部分,如footer.html)时,不是完全构建的HTML文档。

那么,如何在从文件加载HTML时保留utf8字符,但是没有<meta />个密钥存在,并且定义它们不是一个选项?

更新

footer.html(文件以UTF-8编码,没有BOM):

<div id="footer">
    <p>My sūpēr ōzōm ūtf8 štrīņģ</p>
</div>

的index.php:

$dom = new DOMDocument;
$dom->loadHTMLFile('footer.html');
echo $dom->saveHTML(); // results in all familiar effed' up characters

提前致谢!

4 个答案:

答案 0 :(得分:6)

尝试像这样的黑客攻击:

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
// dirty fix
foreach ($doc->childNodes as $item)
    if ($item->nodeType == XML_PI_NODE)
        $doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper

此处的用户评论中列出了其他几个:http://php.net/manual/en/domdocument.loadhtml.php。同样重要的是,您的文档头包含一个元标记,用于直接在标记之后指定编码FIRST。

答案 1 :(得分:5)

我建议在这里使用我的答案:https://stackoverflow.com/a/12846243/816753而不是添加另一个<head>,将整个片段包装在

<html>
    <head><meta http-equiv='Content-type' content='text/html; charset=UTF-8' /></head>
    <body><!-- your content here --></body>
</html>`

答案 2 :(得分:4)

虽然我不确定如何使用->loadHTMLFile()解决问题,您是否考虑使用file_get_contents()获取HTML,在该字符串上运行mb_convert_encoding(),然后通过该值是->loadHTML()

编辑:此外,当您 initialize DOMDocument 时,您是否在给它$ encoding参数?

答案 3 :(得分:3)

密钥仅适用于您的浏览器。页面全部构建完毕后,如果页面末尾有元数据,则浏览器应正确显示页面。

你可以尝试使用utf8_decode(或编码,我永远不会确定lol)函数,然后回显数据:

echo utf8_decode($dom->saveHTML());