2011-04-22 105 views
2

我有這樣的代碼:如何編碼/解碼NodeJS中的字符集編碼?

request({ url: 'http://www.myurl.com/' }, function(error, response, html) { 
    if (!error && response.statusCode == 200) { 
    console.log($('title', html).text()); 
    } 
}); 

但是,網站,即時通訊爬行可以有不同的字符集(UTF8,ISO-8859-1,等等。)如何讓它和編碼/解碼總是將HTML到正確的編碼(utf8)?

感謝和我的英語很抱歉;)

+0

嗯,我知道我可以使用的選項'encoding'的請求,但這個問題我不知道該頁面的又字符集(我知道用頭或meta標籤) – William 2011-04-23 14:33:50

回答

0

首先,你可以發送接收字符頭這將防止網站中的字符集發送數據。

一旦你得到迴應,你可以檢查字符集的Content-Type頭,並做適當的處理。

當內容編碼未知時,Anothr hack(我曾經使用過)嘗試使用所有可能的內容編碼進行解碼,並堅持不拋出異常(使用python)。

+0

您也可以嘗試在此頁面上公佈的模塊:http://groups.google.com/group/nodejs/browse_thread/thread/38dc4444b2e1436c,以下是方向鏈接:https://github.com/franzenzenhofer/whatlang – dhruvbird 2011-04-26 17:51:36

2

網站可以返回的內容類型頭的內容編碼或返回的HTML裏面的內容類型元標記的,例如:

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

可以使用charset模塊自動檢查這兩個爲你。不是所有的網站或服務器都會指定一個編碼,所以你會想回到檢測數據本身的字符集。 jschardet模塊可以幫助你。

一旦你制定了字符集,你可以使用iconv模塊來進行實際的轉換。這裏有一個完整的例子:

request({url: 'http://www.myurl.com/', encoding: 'binary'}, function(error, response, html) { 
    enc = charset(response.headers, html) 
    enc = enc or jchardet.detect(html).encoding.toLowerCase() 
    if enc != 'utf-8' 
     iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE') 
     html = iconv.convert(new Buffer(html, 'binary')).toString('utf-8') 
    console.log($('title', html).text()); 
});