node读取本地文件中文乱码

JavaScript013

node读取本地文件中文乱码,第1张

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') 无济于事。

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

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

问题:使用 koa-bodyparser 可以解析post提交的问题,但是发现获取不到formdata上传的文件。

后经查资料,改用 koa-body 解决:

constkoaBody = require('koa-body')app.use(koaBody({ multipart:true, formidable: { maxFileSize:200*1024*1024//设置上传文件大小最大限制,默认2M} }))

然后就可以在 ctx.request.files 里面获取到上传的 文件信息了。ctx.request.files 为一个对象,里面包含一个 file 字段(为你前端上传定义的值),值为文件信息,主要是文件name和path,path为临时存储路径。

二、解析xlsx文件信息

主要使用模块 node-xlsx :npm i xlsx --save

1、加载模块

使用模块:fs--主要用于写入文件;node-xlsx主要用于转换xlsx数据和读取xlsx的文件数据;

constfs = require('fs')constxlsx = require('node-xlsx')//读写xlsx的插件

2、读取功能

读取功能相对简单,直接使用模块的 prase(路径) 方法就能读取

let list = xlsx.parse("./doc/hello.xlsx")

返回结果,name:表名,data:二维数组。(由于Excel以表格的形式表示,因此表格的数据都是通过二维数组进行接收。)

需要注意的是:data里的第一行数组为表头的信息

[ { name:'firstSheet', data: [ [Array], [Array] ] }, { name:'secondSheet', data: [ [Array], [Array] ] } ]

3、写入功能

写入功能,对应的写入数据与上面读取功能的返回格式需要一致,以数组的形式,name:表名,data:二维数组(Excel每行每列的数据)

如下面代码,生成一个Excel文件,分别两张表,表名分别是firstSheet,secondSheet

let xlsxObj =[ { name:'firstSheet', data: [ [1,2,3], [4,5,6] ], }, { name:'secondSheet', data: [ [7,8,9], [10,1,12] ], } ]

生成Excel文件:

fs.writeFileSync(路径,Buffer数据)

xlsx.build(xlsxObj) 会将数组转换为Buffer数据

执行下面代码就会生成对应的Excel文件

fs.writeFileSync('./doc/hello.xlsx', xlsx.build(xlsxObj),"binary")