DOMDocument
似乎将汉字转换为代码,例如,
你的乱发 将成为ä½ çš„ä¹±å‘
我怎样才能保持中文或其他外语不变,而不是将它们转换为代码?
以下是我的简单测试,
$dom = new DOMDocument();
$dom->loadHTML($html);
如果我在 loadHTML() 之前在下面添加这个,
$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");
我明白,
你的乱发
即使被遮盖的代码将显示为汉字,你的乱发
仍然没有你的乱发
我所追求的......
DOMDocument似乎将汉字转换为代码[...]。我怎样才能保持中文或其他外语不变,而不是将它们转换为代码?
$dom = new DOMDocument();
$dom->loadHTML($html);
如果您使用 loadHTML
函数加载 HTML 区块。默认情况下,DOMDocument
希望该字符串采用HTML的默认编码(ISO-8859-1
),但大多数情况下,字符集(原文如此!)是在您使用的字符串旁边提供的元信息,而不是在里面。为了使这更加复杂,元信息甚至位于字符串中。
无论如何,由于您没有共享HTML的字符串数据,也没有指定编码,因此很难具体说明发生了什么。
我假设 HTML 是 UTF-8 编码的,但这在 HTML 字符串中没有信号。因此,以下解决方法可以提供帮助:
$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
// dirty fix
foreach ($doc->childNodes as $item)
if ($item->nodeType == XML_PI_NODE)
$doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper
它在一开始就注入了一个编码提示(并在加载 HTML 后将其删除)。从那时起,DOMDocument
将返回 UTF-8(一如既往)。
我只是在寻找类似问题的解决方案时偶然发现了这个线程,我在正确加载 html 并使用 Xpath 等进行一些解析后...... 我的文字是这样的:
你的乱发
这在 HTML 正文中显示正常,但在样式或脚本标签中无法正确显示(例如设置中文字体)。
要解决此问题,请反向执行 Lauthiamkok 所做的:
$html = mb_convert_encoding($html, "UTF-8", "HTML-ENTITIES");
如果由于任何原因第一种解决方法对您不起作用,请尝试此转换。
我很确定ä½ çš„ä¹±å‘
实际上是Windows Latin 1(不是ASCII,ASCII中没有变音符号)。在此过程中,您的 UTF-8 文本被保存为 Windows Latin 1。