node读取本地文件中文乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node读取本地文件中文乱码相关的知识,希望对你有一定的参考价值。

参考技术A node读取本地文件

由于Node环境当中不支持GBK编码,此时读到的文件,英文可读取,但中文乱码

node.js当中的Buffer对象支持的编码格式的种类(支持的格式:ascii、utf8、utf16le、ucs2、base64、binary、hex)有限,不支持GBK的编码形式。

解决办法
iconv-lite用于在node当中处理在各种操作系统出现的各种奇特编码,该模块不提供读写文件的操作,只提供文件编码转换的功能。

npm install iconv-lite

restitle即为txt文档中的中文

此时会出现一个警告
Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding

上面这个github中给出了详细解释,大概意思是说
在使用iconv.decode功能进行解码之前,原始资源(无意间)已经body += chunk通过javascript类型转换进行了解码。
双重解码不仅会导致错误的结果,而且几乎不可能恢复原始字节,因为utf8转换是有损的,因此即使这样做也 iconv.decode(new Buffer(body, 'utf8'), 'win1252') 无济于事。

不是很明白,但有个忽略警告的方法

使用前说明一下忽略警告,就不会报错

解决node.js读取.csv文件中文出现乱码问题

问题:使用nestjs,读取csv文件数据,获取到的中文是乱码

原因:数据生成时是GBK编码,nodejs原生读取文件不支持GBK

解决:使用iconv-lite库

示例:

const fs = require('fs');
// filePath为文件路径
const filePath = 'D:/demo.csv';
const stream = fs.createReadStream(filePath,  encoding: 'binary' );
let data = '';
stream.on('error', err => 
  console.error('读取行错误');
  console.error(err);
);
stream.on('data', item => 
  data += item;
);
stream.on('end', () => 
  const buf = Buffer.from(data, 'binary');
  // 获得正常的字符串,没有乱码
  const str = iconv.decode(buf, 'GBK');
);

业务中使用:

import  Injectable  from '@nestjs/common';
const xlsx2json = require('node-xlsx');
const iconv = require('iconv-lite');
const fs = require('fs');

@Injectable()
export class FileService 
  array = [];
  fileAddress = 'D:/home/file;
  async csvTojson(file: any): Promise<any> 
    this.array = [];
    try 
      const list = xlsx2json.parse(file.path);
      // list[0]为Sheet1
      const data = [...list[0].data];
      const arr = [];
      for (let i = 1; i < data.length; i++) 
        if (data[i][14] !== 0) 
          const type = iconv.decode(data[i][6], 'GBK').split('\\t')[0];
          const param = 
            id: data[i][1],
            type: type,
            value: data[i][14],
          ;
          arr.push(param);
        
      
      this.array = arr;
      const dataJson = JSON.stringify(arr);
      fs.writeFileSync(`$this.fileAddress/dataJson.json`, `$dataJson`);
      return 
        code: 200,
        message: '上传成功',
      ;
     catch (err) 
      return 
        code: 503,
        msg: `Service error: $err`,
      ;
    
  

以上是关于node读取本地文件中文乱码的主要内容,如果未能解决你的问题,请参考以下文章

解决node.js读取.csv文件中文出现乱码问题

解决node.js读取.csv文件中文出现乱码问题

JAVA本地TXT文件解决中文乱码问题

JAVA本地TXT文件解决中文乱码问题

java 读取文件流乱码输出乱码

Java读取文件,出现中文乱码,GB2312文件读取乱码