nodejs中buffer模块使用频率较高,因此在node启动的时候自动加载。通常buffer使用的是utf8编码方式,一个汉字编码是以3个utf8码字组成,因此在读取的时候会产生截断,截断的位置不是整数倍的时候会产生乱码。常用的
var fs = require('fs');
var rs = fs.createReadStream('./1.txt');
var data = '';
rs.on('data', function (chunk) {
<span style="white-space:pre"> </span>data += chunk;
});
......
data += chunk隐含data = data.toString()+chunk.toString();依照上述,会产生截断乱码。
这时使用第三方插件iconv-lite,它可以直接使用js实现解码。
var fs = require('fs');
var iconv = require('iconv-lite');
rs = fs.createReadStream('./test.txt');//化成烟,模糊我的视线。万般可怜,只因一厢情愿。
var chunks = [];
var size = 0;
rs.on('data', function(chunk){
chunks.push(chunk);
size += chunk.length;
});
rs.on('end', function(){
var buf = Buffer.concat(chunks, size);
var str = iconv.decode(buf, 'utf8');
console.log(str);
});
Buffer.prototype.concat = function (list, length) {
if (!Array.isArray(list)) {
throw new Error('arguments error');
}
if (length === 0){
return new Buffer(0);
} else if (length === 1) {
return list[0];
}
if (typeof length !== 'number') {
length = 0;
for (var i = 0; i < list.length; i++) {
var tem = list[i];
length += list[i].length;
}
}
pos = 0;
var buf = new Buffer(length);
for (var i = 0; i < list.length; i++) {
var tem = list[i];
tem.copy(buf, pos);
pos += tem.length;
}
return buf;
}