3

我有一些 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->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); 它奏效了!

4

2 回答 2

4

告诉 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);
于 2013-09-10T14:07:03.023 回答
3
$html = '<html>سلام</html>';
$doc = new DOMDocument();

使用 2 个预定义常量 ( & )将 string 的字符编码转换$html为 UTF-8,然后将其加载到 DOM 。 libxmlLIBXML_HTML_NOIMPLIEDLIBXML_HTML_NODEFDTD

第一个设置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 编码本身(之前的定义是用于输入):

$doc->encoding = 'UTF-8';

如果您不使用 libxml 2.7.7(自 PHP >= 5.4.0 起),请删除前导和尾随<html>&标签:<body>

$doc->normalizeDocument(); //Remove leading and trailing <html> & <body> tags
print $doc->saveHTML($doc->documentElement);

玩得开心!

于 2014-06-10T00:26:10.817 回答