2012-01-07 17 views
2
$msg = "<body><a>áéíóú☻♥♦♣</a></body>"; 
$temp_dom = new DOMDocument();  
$temp_dom->loadHTML($msg);  
$dom_xpath = new DOMXpath($temp_dom); 
$ele = $dom_xpath->query('//a')->item(0); 

echo "<pre>"; 
echo "Original: $msg\n"; 
echo $ele->nodeValue;  
echo "</pre>"; 

輸出[?]:帶有XPath編碼問題的DOMDocument。大量的試驗

Original: áéíóú☻♥♦♣ 
áéíóúâ»â¥â¦â£ 

當前文檔編碼是UTF-8。 我也試過ANSI,發生了同樣的問題。

utf8_decode解決問題

echo utf8_decode($ele->nodeValue); 

但事實是,我用了很多的屬性,很多,我會在他們中的每一個使用utf8_decode功能,我相信這不是正確的事情要做。 有人知道我該怎麼做?

請在發佈結果之前使用此測試並對其進行測試,因爲我已經嘗試了很多東西。

非常感謝您提前。

+0

可能的[php:使用DomDocument,每當我嘗試寫UTF-8編寫它的十六進制表示法]的重複時(http://stackoverflow.com/questions/3575109/php-using-domdocument-whenever-i-嘗試寫入utf-8-it-writes-the-hexadecimal-n) – Gordon 2012-01-07 18:21:45

回答

4

問題是你需要告訴DOMDocument在解析HTML時編碼是什麼。您無法通過設置encoding選項來完成此操作。 (我相信這會影響文檔如何與saveHTML一起輸出。)

這樣做的方法稍微有些黑,就是將編碼語句插入到文檔中。您可以簡單地通過在解析HTML之前插入'<?xml encoding="UTF-8">'來完成此操作。

<?php 

$msg = "<body><a>áéíóú☻♥♦♣</a></body>"; 
$temp_dom = new DOMDocument();  


$temp_dom->loadHTML('<?xml encoding="UTF-8">' . $msg);  
$temp_dom->encoding = 'UTF-8'; 
$dom_xpath = new DOMXpath($temp_dom); 
$ele = $dom_xpath->query('//a')->item(0); 

echo "<pre>"; 
echo "Original: $msg\n"; 
echo $ele->nodeValue;  
echo "</pre>"; 

輸出:但是

<pre>Original: <body><a>áéíóú☻♥♦♣</a></body> 
áéíóú☻♥♦♣</pre> 

注意的是,這並插入一個額外的節點作爲文檔對象的一個​​孩子(一個DOMProcessingInstruction要準確),所以要意識到這一點,如果你是用$temp_dom->childNodes等做任何事情。

+0

謝謝。這正是我所要求的。 ; D其實訣竅是聲明DOCTYPE(<?xml encoding =「UTF-8」>),我沒有意識到XPath可以考慮這個來定義要使用的編碼。謝謝。 :) – Grego 2012-01-07 20:55:09