最近研究了一點(diǎn)點(diǎn)關(guān)于nodejs的東西,然后發(fā)現(xiàn)了一個(gè)簡(jiǎn)單但是不知道就要查好久的知識(shí)點(diǎn)(浪費(fèi)了我1個(gè)多小時(shí),資源也少),這里記錄分享一下。
引子
想寫一個(gè)服務(wù)器程序,可惜手頭上沒(méi)有什么資源拿來(lái)測(cè)試,于是就寫了個(gè)小爬蟲(chóng)去別人網(wǎng)站上面偷偷扒一點(diǎn),結(jié)果內(nèi)容是扒下來(lái)了,但是亂碼了。
然后只能根據(jù)我iOS開(kāi)發(fā)的經(jīng)驗(yàn),去網(wǎng)上找轉(zhuǎn)碼工具,然后就發(fā)現(xiàn)了這貨。
根據(jù)網(wǎng)上扒來(lái)的資訊,這個(gè)包是純js編寫的轉(zhuǎn)碼工具,相對(duì)而言,會(huì)比iconv這個(gè)要更適合js。
這個(gè)東西的用法也很簡(jiǎn)單,如下:
var iconv = require('iconv-lite');
// Convert from an encoded buffer to js string.
str = iconv.decode(new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251');
// Convert from js string to an encoded buffer.
buf = iconv.encode("Sample input string", 'win1251');
// Check if encoding is supported
iconv.encodingExists("us-ascii")
但是,結(jié)合我的請(qǐng)求網(wǎng)頁(yè)內(nèi)容的方法總有些問(wèn)題,先貼網(wǎng)絡(luò)請(qǐng)求庫(kù)。
也是眼下用的比較多的網(wǎng)絡(luò)請(qǐng)求庫(kù),基本用法如下:
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
開(kāi)始遇坑
我被這個(gè)基本用法給坑了,它這個(gè)默認(rèn)請(qǐng)求是以u(píng)tf8進(jìn)行解碼的,然后我這個(gè)扒的站的編碼是:
然后拿到的結(jié)果就是文章開(kāi)頭那個(gè)樣子了,中文就是個(gè)悲劇啊。
接下來(lái)的結(jié)果就是,我用這個(gè)已經(jīng)被utf8解碼的文本,編碼回原始數(shù)據(jù),可惜我不知道它已經(jīng)用了utf8,所以就用了gb2312,最后就是錯(cuò)上加錯(cuò)。
折騰了20分鐘后
我無(wú)奈了,來(lái)來(lái)回回搞了好多次,開(kāi)始慢慢看這些庫(kù)的源代碼。
好嘛,原來(lái)request里面有這么一段介紹:
encoding
- Encoding to be used onsetEncoding
of response data. Ifnull
, thebody
is returned as aBuffer
. Anything else (including the default value ofundefined
) will be passed as the encoding parameter totoString()
(meaning this is effectivelyutf8
by default). (Note: if you expect binary data, you should setencoding: null
.)
不用轉(zhuǎn)來(lái)轉(zhuǎn)去了,直接扒到的數(shù)據(jù)就是不編碼的了,然后只要用這樣一個(gè)小方法就搞定了:
function decodeData(data) {
return iconv.decode(data, 'gb2312');
}
終
以后用request請(qǐng)求數(shù)據(jù),建議都使用無(wú)解碼請(qǐng)求,然后再進(jìn)行轉(zhuǎn)碼。
好了,最終效果出來(lái)了~
有什么問(wèn)題歡迎大家留言討論~~
為啥不用request請(qǐng)求數(shù)據(jù)的時(shí)候直接解碼啊?
因?yàn)槿思也恢С职 ?/p>
相關(guān)內(nèi)容有利益問(wèn)題我可以修改的,請(qǐng)通知我,謝謝~~(我扒的網(wǎng)站不會(huì)來(lái)找我吧。。)