nodejs的fs.read()方法读取文件部分内容,导致最后一个汉字只读取了一位

子羽
  • 136

使用nodejs的fs.read()方法读取txt文件的部分内容,
缓冲区设置的大小为1024字节,
因为一个汉字占两个字节,导致偶尔出现最后一个汉字只读取了一个字节,出现乱码

// 读取文件

var fs = require('fs')

// 创建一个1024字节的缓冲区,并自动用0填满
var buf = new Buffer.alloc(1024,'utf8');

fs.open('text.txt', 'r+', function(err,fd){
    if(err) throw err
    console.log('打开文件成功!')
    fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
        if(err) throw err
        console.log(bytes + "  字节被读取");
        // 仅输出读取的字节
        if(bytes > 0){
            console.log('文件内容是:' + buf.slice(0, bytes).toString());
        }
    })
})
回复
阅读 3.7k
2 个回答
moddx
  • 1.3k
✓ 已被采纳

推荐使用iconv-lite,下面是一个例子:

const fs = require('fs');
const res = fs.createReadStream('data.txt', { highWaterMark: 1024});
const iconv = require('iconv-lite');

let chunks = [];
let size = 0;
res.on('data', function (chunk) {
  chunks.push(chunk);
  size += chunk.length;
});
res.on('end', function () {
  let buf = Buffer.concat(chunks, size);
  let str = iconv.decode(buf, 'utf8');
  // 输出
  console.log(str);
});

如果你能确保读取的文件只有UTF-8编码的话,不引入第三方模块也行:

const fs = require('fs');
const res = fs.createReadStream('data.txt', { highWaterMark: 1024});
res.setEncoding('utf8');

let data = '';
res.on('data', function (chunk){
  data += chunk;
});
res.on('end', function () {
  // 输出
  console.log(data);
});

utf8 一个汉字三个字节

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏