2013-07-24 30 views
2

如果我使用echo $doc->saveHTML();它會相應地顯示字符,但是一旦它到達xml?在xpath中提取元素,問題又回來了。xpath後的PHP DomXPath編碼問題

我似乎無法正確顯示字符。我如何正確轉換它。我越來越:

婢跺繐顒滈拺鍙ョ瀵偓鐞涱偊鈧繑妲戦挅鍕綍婢舵牕顨� 闂€鍌溾敄緙侊綀濮蟲稉濠呫€� 娑擃叀顣葷純鎴犵綍閺冭泛鐨繪總鍏呯瑐鐞涳綀鏉藉▎ 

而不是正確的中國:

<head><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta charset="gbk"/></head> 

我的PHP代碼:

$html = file_get_contents('http://item.taobao.com/item.htm?spm=a2106.m874.1000384.41.aG3Kbi&id=20811635147&_u=o1ffj7oi9ad3&scm=1029.newlist-0.1.16&ppath=&sku='); 
$doc = new DOMDocument(); 

// Based on Article http://stackoverflow.com/questions/11309194/php-domdocument-failing-to-handle-utf-8-characters/11310258#11310258 
$searchPage = mb_convert_encoding($html,"HTML-ENTITIES","GBK"); 
$doc->loadHTML($searchPage); 
// echo $doc->saveHTML(); 

$xpath = new DOMXpath($doc); 
$elements = $xpath->query("//*[@id='detail']/div[1]/h3"); 

foreach ($elements as $e) { 
    //echo $e->nodeValue; 
    echo mb_convert_encoding($e->nodeValue,"utf-8","gbk"); 
} 
+0

'gbk'編碼[不支持](http://php.net/manual/en/mbstring.supported-encodings.php)。改爲使用「GB18030」或「EUC-CN」。 –

+0

@HashemQolami但我設法mv_convert沒有問題的GBK,它只是當它成爲一個DOMpath($ doc)的東西出錯了? – CodeGuru

回答

2

既然你已經轉換的文檔轉換爲HTML實體,你不」在打印結果時,需要轉換編碼。所以:

echo $e->nodeValue; 
// echo mb_convert_encoding($e->nodeValue,"utf-8","gbk"); 

你沒有得到正確的輸出的原因是,你把<meta charset="gbk"/>在你的HTML,而應該是<meta charset="utf-8"/>

4

你有to_encoding在上次通話各地from_encoding參數mb_convert_encoding走錯了路。從XPath查詢返回的內容編碼爲UTF-8,但您希望將輸出編碼爲gbk(因爲您已將元字符集設置爲「gbk」)。

所以最終的循環應該是:

foreach ($elements as $e) { 
    echo mb_convert_encoding($e->nodeValue,"gbk","utf-8"); 
} 

to_encoding是 「GBK」,並且from_encoding是 「UTF-8」。

也就是說,AgreeOrNot給出的答案也應該工作,如果你對頁面被編碼爲UTF-8感到滿意。


至於編碼過程是如何工作的,內部DOM文檔使用UTF-8,所以這就是爲什麼你從你的XPath查詢得到的結果是UTF-8,以及爲什麼需要將其轉換成gbk mb_convert_encoding如果那是你需要的字符集。

當您呼叫loadHTML時,它會嘗試檢測源編碼,然後將輸入從該編碼轉換爲UTF-8。不幸的是,檢測算法並不總是工作得很好。

例如,雖然您的示例頁面設置字符集元標記,即元標記不被loadHTML認可,所以它默認爲假設源編碼是Latin1的。如果您使用了指定Content-Type的元標記,它會起作用。

<meta http-equiv="Content-Type" content="text/html; charset=gbk" /> 

另一種方法是完全避免這個問題,但通過將所有非ASCII字符轉換爲html實體(如您所做的那樣)。這樣,loadHTML檢測字符編碼是否正確無關緊要,因爲不會有任何需要轉換的字符。