2015-08-08 61 views
0

法国编码问题我尝试解析使用DOM文档和XPath html元素法文文本。问题是,输出编码不正确。在DOM文档

这里是一个文本法语:

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

感谢您的任何建议。

+0

试着看一下[这个答案](http://stackoverflow.com/questions/2142120/php-encoding -with-domdocument) –

+0

@BogdanKuštan谢谢!这是工作 – Vitaly

回答

2

使用这个命令:

$doc->loadHTML($html); 

你指挥DOM文档加载您的字符串$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(向下滚动到所述注释部并阅读有关的字符编码)。

为了获得更好的视野上的文件,调用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可以实际加载或不加载,它还将字符串前缀为魔术字符“<?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 

搜寻在许多differen PHP版本的在线演示在这里:http://3v4l.org/TT3SM