DOMDocument中法语编码的问题


Problems with French encoding in DOMDocument

我尝试使用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">
      &Atilde;&nbsp; la t&Atilde;&copy;l&Atilde;&copy;chargez m&Atilde;&ordf;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