今天寫代碼的時候用到iconv-lite庫的decode方法,給出了warning。說是deprecated,因而我順着他的鏈接看了一下具體的文章,記錄以下。
轉自Use Buffers when decodingjavascript
首先如下是錯誤的:java
var http = require('http'), iconv = require('iconv-lite'); http.get("http://website.com/", function(res) { var body = ''; res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { var decodedBody = iconv.decode(body, 'win1252'); console.log(decodedBody); }); });
在調用iconv.decode這個函數以前,原始數據已經被javascript內部給decode了。web
res.on('data', function(chunkBuffer) { body += chunkBuffer.toString('utf8'); });
也就是說再調用iconv.decode的話實際就是decode了兩次,這樣會丟失binary原始數據的。若是你使用了res.setEncoding('utf-8')
的話也會有同樣的效果。
真正正確的辦法是用Buffer類型的數組接收數據,而後拼接,最後decode。代碼以下:數組
http.get("http://website.com/", function(res) { var chunks = []; res.on('data', function(chunk) { chunks.push(chunk); }); res.on('end', function() { var decodedBody = iconv.decode(Buffer.concat(chunks), 'win1252'); console.log(decodedBody); }); }); // Or, with iconv-lite@0.4 and Node v0.10+, you can use streaming support with `collect` helper http.get("http://website.com/", function(res) { res.pipe(iconv.decodeStream('win1252')).collect(function(err, decodedBody) { console.log(decodedBody); }); });
最後做者還提到怎麼沉默那條waring的方法:函數
iconv.skipDecodeWarning = true;```