我尝试使用DOMDocument和Xpath从html元素解析法语文本。问题是输出编码不正确。
下面是一段法语文本:
à la téléchargez mêmes
我看到的输出:
à la téléchargez mêmes
PHP代码:<?php
$html = '<div id="demo">à la téléchargez mêmes</div>';
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
echo $xpath->query("//div[@id='demo']")->item(0)->nodeValue;
谢谢你的建议
使用以下命令:
$doc->loadHTML($html);
命令DOMDocument加载字符串$html
$html = '<div id="demo">à la téléchargez mêmes</div>';
使用ISO-8859-1编码。
但是你在这里使用的字符串不是你自己用ISO-8859-1编码查看/键入的,而是用UTF-8编码。
所以严格来说,你打错了;)
另一方面,当您使用脚本命令返回值时:
$xpath->query("//div[@id='demo']")->item(0)->nodeValue;
该值将被UTF-8编码(向下滚动到Notes部分并阅读有关字符编码的信息)。
为了更好地查看文档,只需在调用loadHTML
后直接输出它,以便您可以更好地看到发生了什么(echo $doc->saveHTML();
, beautified):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<div id="demo">
à la téléchargez mêmes
</div>
</body>
</html>
如您所见,您已经明确地命令插入Atile和非断行空格以及所有这些其他字符,字符串被视为HTML 4.0,并且由于字符串中的HTML没有指定任何特定的字符编码,因此使用默认编码(ISO-8859-1)。
所以你在那里做什么,你可以进一步阅读现有的材料涵盖了这一点,并有更多的信息:
- PHP DomDocument无法处理utf-8字符(☆)(july 2012)
- 如何保持中文或其他外语的原样,而不是将它们转换成代码?(2012年4月)
除了第一个给出的答案之外,在你的情况下还有另一种方法:
$saved = libxml_use_internal_errors(true);
$result = $doc->loadHTML('<?xml>' . $html);
########
libxml_use_internal_errors($saved);
if ($result) {
$doc->removeChild($doc->documentElement->previousSibling);
}
这个例子不仅添加了正确的错误处理和返回值检查,如果HTML可以实际加载或不,它还添加了一个魔术序列"<?xml>
";将loadHTML
设置为UTF-8模式。在用UTF-8编码加载HTML字符串之后,再次删除DOMProcessingInstruction。编码将保持不变:
$xpath = new DOMXpath($doc);
echo $xpath->query("//div[@id='demo']")->item(0)->nodeValue;
# prints "à la téléchargez mêmes" now
找到它在许多不同的PHP版本的在线演示:http://3v4l.org/TT3SM