编码DOMDocument php的错误字符

时间:2012-08-20 08:12:31

标签: php character-encoding domdocument

我有一些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'));  它有效!

2 个答案:

答案 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);

玩得开心!