为什么php DOM解析会影响charset?

时间:2009-10-04 14:06:59

标签: php dom encoding character-encoding

$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$elements = $dom->getElementsByTagName('span');
$spans = array();
foreach($elements as $span) {
    $spans[] = $span;
}
foreach($spans as $span) {
    $span->parentNode->removeChild($span);
}
return $dom->saveHTML();    
//return $string;

当我使用此代码解析字符串时,如果取消注释return $string,则更改编码和符号不会显示相同。为什么会如此以及如何避免字符集更改

3 个答案:

答案 0 :(得分:2)

尝试在constructorDOMDocument->encoding中设置编码:

$dom = new DOMDocument('1.0', '…');
// or
$dom = new DOMDocument();
$dom->encoding = '…';

答案 1 :(得分:1)

不幸的是,DOMDocument似乎会自动将所有字符转换为HTML实体,除非它知道原始文档的编码。

显然,一个选项是将带有内容类型/编码的<meta>标记添加到原始字符串,但这意味着它也将出现在输出中。删除它可能不是那么容易。

我能想到的另一个选择是手动解码HTML实体,使用如下代码:

$trans = array_flip(get_html_translation_table(HTML_ENTITIES));
unset($trans["&quot;"], $trans["&lt;"], $trans["&gt;"], $trans["&amp;"]);
echo strtr($dom->saveHTML(), $trans);

这是一个非常难看的解决方案,但除了使用不同的HTML解析器之外,我无法想到任何其他内容。 :(

答案 2 :(得分:0)

今天我注意到还有一个有趣的事情......我没有意识到它为什么会发生,但这是非常奇怪的行为......来自顶部的代码设置为功能。当字符串传递给函数时,在函数处理之后,在一些无法解释的情况下,它将返回<doctype...> <html><body>STRING</body></html>。 数据从数据库加载,当db中的这些数据直接进入函数时,它不会添加这些额外的标记,但是当数据首次存储到变量并且在下面的某处调用此函数时,会添加这些额外的值。 还有一件奇怪的事...... 我有一个案例,当我调用这个额外的函数来处理字符串和几行以下我添加了修剪函数它从dom函数返回我的错误...当我删除这个修剪函数(这被称为AFTER dom函数)时,错误消失了......有任何合理的解释吗?