DOMDocument中的法语编码问题

时间:2015-08-08 07:11:45

标签: php html parsing xpath domdocument

我尝试使用DOMDocument和Xpath从html元素解析法语文本。问题是输出编码不正确。

这是法文文本:

from os.path import dirname
import my_module

print(dirname(my_module.__file__))  # NOTE: Python 3.x

我在输出中看到的内容:

à la téléchargez mêmes

PHP代码:

à la téléchargez mêmes

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

使用此命令:

$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;

that value will be UTF-8 encoded(向下滚动到 Notes 部分,阅读有关字符编码的信息)。

要更好地查看文档,只需在调用loadHTML后直接输出,以便您可以更好地查看正在进行的操作(echo $doc->saveHTML();,美化):

<!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没有指定任何特定的字符编码,因此使用了the default encoding (ISO-8859-1)

因此,对于您在那里所做的事情,您可以继续阅读涵盖此内容的现有材料,并提供更多信息:

除了answer given in the first of the two之外,还有另外一种方法可以做到这一点:

$saved = libxml_use_internal_errors(true);

$result = $doc->loadHTML('<?xml>' . $html);
                         ########

libxml_use_internal_errors($saved);

if ($result) {
    $doc->removeChild($doc->documentElement->previousSibling);
}

此示例不仅添加了正确的错误处理和返回值检查,如果HTML实际上是否可以加载,它还会在字符串前面添加一个将设置{{1}的魔术序列“<?xml>”进入UTF-8模式。使用UTF-8编码加载HTML字符串后,再次删除 DOMProcessingInstruction 。编码将保留:

loadHTML

在这里通过许多不同的PHP版本在线演示:http://3v4l.org/TT3SM