2015-08-08 98 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