CSV文件上传后台解析乱码问题

1. 问题描述

后台用node来解析前端上传的CSV文件,由于不同系统CSV文件编码格式不同,导致后台解析出现乱码。

2. 解决思路

找出CSV编码格式 —> 用该编码方式解码 —> csv-parse解析内容

3. 实践

NPM库 jschardet 可以识别出一个Buffer数据所使用的编码格式。

用法如下

1
2
3
const jschardet = require("jschardet");
jschardet.detect("\xc3\xa0\xc3\xad\xc3\xa0\xc3\xa7\xc3\xa3");
// { encoding: "UTF-8", confidence: 0.9690625 }

支持如下编码

  • Big5, GB2312/GB18030, EUC-TW, HZ-GB-2312, and ISO-2022-CN (Traditional and Simplified Chinese)
  • EUC-JP, SHIFT_JIS, and ISO-2022-JP (Japanese)
  • EUC-KR and ISO-2022-KR (Korean)
  • KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, and windows-1251 (Russian)
  • ISO-8859-2 and windows-1250 (Hungarian)
  • ISO-8859-5 and windows-1251 (Bulgarian)
  • windows-1252
  • ISO-8859-7 and windows-1253 (Greek)
  • ISO-8859-8 and windows-1255 (Visual and Logical Hebrew)
  • TIS-620 (Thai)
  • UTF-32 BE, LE, 3412-ordered, or 2143-ordered (with a BOM)
  • UTF-16 BE or LE (with a BOM)
  • UTF-8 (with or without a BOM)
  • ASCII

4. 代码

1
2
3
4
5
6
7
8
9
const jschardet = require("jschardet")
const iconv = require('iconv-lite');
const csvParser = require('csv-parse');
// 识别文件编码格式
const { encoding } = jschardet.detect(buffer);
// 按照原格式解码文件
const content = iconv.decode(buffer, encoding);
// 解析文件内容
csvParser(content);