Nodejs读取csv中文乱码

需求:前端上传文件到Node —>Node上传文件到OSS
问题:部分文件上传后会出现乱码
原因:Node原生读取文件又不支持GBK编码
解决思路:①判断文件编码格式是否是UTF-8②文件编码格式不是UTF-8时,进行转码
第一步:获取文件编码格式
1.使用jschardet模块获取文件编码格式
①安装jschardet模块

npm install jschardet

②获取文件内容

//引入文件
const jschardet = require("jschardet");
//filePath ==> 文件路径
const stream = fs.createReadStream(filePath, { encoding: "binary" });
let data = "";
stream.on("error", err => {
  console.error("读取行错误");
  console.error(err);
});
stream.on("data", chunk => {
  data += chunk;
});
stream.on("end", () => {
  let result = jschardet.detect(data);
  console.log(result.encoding)  //输出文件编码格式
});

2.文件格式不是UTF8,通过iconv用GBK解码
①安装iconv-lite

npm install iconv-lite

②解码

const buf = Buffer.from(data, "binary");
const str = iconv.decode(buf, "GBK"); // 得到正常的字符串,没有乱码

完成的代码

//引入文件
const iconv = require("iconv-lite");
const jschardet = require("jschardet");
const fs = require("fs");
const { path: filePath } = req.files.file;
exports.uploadOSS = async function(req, res) {
  const { path: filePath } = req.files.file;
  //上传文件路径
  let newFilePath = filePath;
  const stream = fs.createReadStream(filePath, { encoding: "binary" });
    let data = "";
    stream.on("error", err => {
      console.error("读取行错误");
      console.error(err);
    });
    stream.on("data", chunk => {
      data += chunk;
    });
    stream.on("end", () => {
      let result = jschardet.detect(data);
      //文件编码格式不是UTF-8
      if (result.encoding !== "UTF-8") {
        const buf = Buffer.from(data, "binary");
        const str = iconv.decode(buf, "GBK"); // 得到正常的字符串,没有乱码
        //重新写入文件后进行上传
        fs.writeFile("/var/tmp/" + req.body.name, str, ["utf8"], function(err) {
          if (err) console.log("fail " + err);
          else console.log("写入文件ok");
          //将文件地址重新赋值
          newFilePath = "/var/tmp/" + req.body.name;
        });
      } else {
        //文件编码格式是UTF-8
        newFilePath = filePath;
      }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值