使用DOMDocument-> saveHTML()自动将Unicode字符转换为数字值

时间:2013-04-05 16:57:10

标签: php unicode domdocument

我使用以下函数来获取html字符串的内部html

function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
        $tmp_dom = new DOMDocument('1.0', 'UTF-8');
        $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
        $innerHTML .= trim($tmp_dom->saveHTML()); 
    }

    return $innerHTML; 
} 

我的html字符串也包含unicode字符。这是html字符串

的示例
$html = '<div>Thats True. Yes it is well defined آپ مجھے تم کہہ کر پکاریں</div>';

当我使用上述功能时

$output = DOMinnerHTML($html);

输出如下

$output = '<div>Thats True. Yes it is well defined 
&#1705;&#1746;&#1748;&#1587;&#1604;&#1591;&#1575</div>';

将实际的unicode字符转换为数字值。

我调试了代码并发现在DOMinnerHTML函数之前的下一行

$innerHTML .= trim($tmp_dom->saveHTML()); 

如果我回应

echo $tmp_dom->textContent;

它显示实际的unicode字符,但在保存到$innerHTML后,它会输出数字符号。 为什么这样做。

注意:请不要建议我使用html_entity_decode函数将数字符号转换为真正的unicode字符,因为我的html字符串中也有用户格式的数据,我不想转换。

注意:我也试过把

<meta http-equiv="content-type" content="text/html; charset=utf-8">

在我的html字符串之前但没有区别。

3 个答案:

答案 0 :(得分:0)

很好的问题,你做了一个很好的工作,将问题缩小到一行代码,导致事情变得混乱!这让我可以弄清楚出了什么问题。

问题在于DOMDocument's saveHTML() function。它正在做它应该做的事情,但它的设计并不是你想要的。

saveHTML()将文档转换为“使用HTML格式”的字符串 - 这意味着它为您执行HTML实体编码!可悲的是,这不是你想要的。 PHP文档中的注释也表明DOMDocument不能很好地处理utf-8,并且不能很好地处理片段(因为它会自动添加html,doctype等)。

只需使用另一个类alternative to DOMDocument

,查看此评论即可获得建议的解决方案
  

看到很多关于某些DOMDocument缺点的投诉后,   例如编码处理不当并始终保存HTML片段   有了,和DOCTYPE,我认为更好的解决方案是   需要的。

     

所以这里是:SmartDOMDocument。你可以找到它   http://beerpla.net/projects/smartdomdocument/

     

目前,主要亮点是:

     
      
  • SmartDOMDocument继承自DOMDocument,因此它非常易于使用 - 只需声明一个SmartDOMDocument类型的对象而不是DOMDocument,并享受所有现有的新行为   功能(见下面的例子)。

  •   
  • saveHTMLExact() - DOMDocument有一个设计极其糟糕的“功能”,如果您加载的HTML代码不包含    和标签,它自动添加它们(是的,没有   用于关闭此行为的标志)。因此,当你打电话   $ doc-&gt; saveHTML(),您新保存的内容现在有和   其中有DOCTYPE。尝试使用代码片段时不是很方便   (XML也有类似的问题)。 SmartDOMDocument包含一个新功能   称为saveHTMLExact(),它完全符合您的要求 - 它   保存HTML而不添加DOMDocument所做的额外垃圾。

  •   
  • 编码修复 - 众所周知,DOMDocument不能正确处理编码(至少是UTF-8)并使输出变得混乱。 SmartDOMDocument尝试   通过增强loadHTML()来解决这个问题   编码正确。这种行为对你来说是透明的 - 只需使用   像往常一样加载HTML()。

  •   

答案 1 :(得分:0)

我有类似的问题。在阅读了上述评论后,经过进一步调查,我找到了一个非常简单的解决方案。

您只需使用html_entity_decode()转换saveHTML()的输出,如下所示:

// Create a new dom document
$dom = new DOMDocument();


// .... Do some stuff, adding nodes, ...etc.


// the html_entity_decode function will solve the unicode issue you described
$result = html_entity_decode($dom->saveHTML();

// echo your output
echo $result;

这将确保正确显示unicode字符

答案 2 :(得分:0)

mb_convert_encoding($ HTML,&#39; HTML实体&#39;,&#39; UTF-8&#39);

这对我有用