我有一些html内容,其所有文本都是波斯语! 我想通过方法DOMDocument :: loadHTML($ html)将这个内容提供给DOMDocument做一些东西,然后通过DOMDocument :: saveHTML()给它回来......但显示字符有问题:-( 例如“سلام”更改为“سٔاÙ...“,即使我将脚本文件编码更改为UTF-8,但它不起作用。
<?php
$html = "<html><meta charset='utf-8' /> سلام</html>";
$doc = new DOMDocument('1.0', 'utf-8');
$doc->loadHTML($html);
print $html; // output : سلام
print $doc->saveHTML(); // output : سلام
print $doc->saveHTML($doc->documentElement); // output : سÙاÙ
?>
更新:根据朋友指示,我使用$ doc-&gt; loadHTML(mb_convert_encoding($ html,'HTML-ENTITIES','UTF-8')); 它有效!
答案 0 :(得分:3)
告诉XML解析器正在读取的数据是UTF-8编码的:
<?php
// original input (unknown encoding)
$html = '<html>سلام</html>';
$doc = new DOMDocument();
// specify the input encoding
$doc->loadHTML('<?xml encoding="utf-8"?>' . $html);
// specify the output encoding
$doc->encoding = 'utf-8';
// output: <html><body><p>سلام</p></body></html>
print $doc->saveHTML($doc->documentElement);
答案 1 :(得分:2)
$html = '<html>سلام</html>';
$doc = new DOMDocument();
将字符串$html
的字符编码转换为UTF-8,然后使用2 libxml
个预定义常量(LIBXML_HTML_NOIMPLIED
&amp; LIBXML_HTML_NODEFDTD
)将其加载到DOM 。
第一个设置HTML_PARSE_NOIMPLIED flag
,这会关闭隐含的html / body ...元素的自动添加(从PHP 5.4.0开始只能使用)。
第二个设置HTML_PARSE_NODEFDTD
标志,这可以防止在找不到默认文档类型时添加默认文档类型。使用这些常量可以帮助您以更灵活的方式管理解析。
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
然后定义DOM编码本身(previouse定义用于输入):
$doc->encoding = 'UTF-8';
删除前导和尾随<html>
&amp; <body>
标签,如果您不使用libxml 2.7.7(从PHP&gt; = 5.4.0开始):
$doc->normalizeDocument(); //Remove leading and trailing <html> & <body> tags
print $doc->saveHTML($doc->documentElement);
玩得开心!