编码问题

fs在读取文件的时候,会把文件读取为buffer,buffer有一个toString()方法,可以把文件转换为字符串,但是默认编码是utf8,读取编码为gbk的文件就会乱码。本文将会读取一个编码为gbk的歌词文件,下面是过程。

目录结构

|— 14-readFileSync.js

|— blood.lrc

14-readFileSync.js

1
2
3
4
5
6
7
8
9
10
11
12
//同步读取文件的内容
//所有的文件操作都是基于fs模块
const fs = require("fs");
//无论是同步还是异步,文件操作都要使用绝对路径
const path = require("path");
//将文本读取到一个buffer中
const buffer = fs.readFileSync(path.join(__dirname,"./blood.lrc"));
//将buffer中的内容读取出来
const data = buffer.toString();
console.log(data);

执行14-readFileSync.js

1
2
3
4
5
6
7
8
9
10
$ node 14-readFileSync.js
[ti:ѪȾ�ķ��]
[ar:��ҫ��]
[al:��ɽ�˺�]
[offset:500]
[00:01.21] ������ѪȾ�ķ��
...中间省略
[03:19.42] ���͹���������������ѪȾ�ķ��
[03:25.51] * * *
[03:32.98] ---End---

读取出来的是乱码,为什么是乱码呢?因为编码问题,.lrc文件是gbk编码,node默认是utf8编码

为了解决编码问题,我们需要引入第三方模块 iconv-lite

在项目目录下创建package.json

1
$ npm init -y
1
$ npm install iconv-lite --save-dev

好了,模块安装好了之后我们就可以直接引用了

14-readFileSync.js

1
2
3
4
5
6
7
8
9
10
11
12
const fs = require("fs");
const path = require("path");
const buffer = fs.readFileSync(path.join(__dirname,"./blood.lrc"));
- const data = buffer.toString();
- console.log(data);
+ //我们需要引入第三方模块
+ const iconv = require("iconv-lite");
+ const data2 = iconv.decode(buffer,"gbk");
+ console.log(data2);

执行14-readFileSync.js

1
2
3
4
5
6
$ node 14-readFileSync.js
[ti:血染的风采]
[ar:黄耀明]
...中间省略
[03:25.51] * * *
[03:32.98] ---End---

done,成功读取。


下面我们用异步的方式再来读取一下

15-readFile.js

1
2
3
4
5
6
7
8
9
10
const fs = require("fs");
const path = require("path");
const iconv = require("iconv-lite");
const filename = path.join(__dirname,"./blood.lrc");
fs.readFile(filename,(err,data) => {
if(err) throw err;
console.log(iconv.decode(data,"gbk"));
});

执行15-readFile.js

1
2
3
4
5
6
$ node 15-readFile.js
[ti:血染的风采]
[ar:黄耀明]
...中间省略
[03:25.51] * * *
[03:32.98] ---End---

也一样读取成功。


本文结束,感谢阅读。

本文作者:melody0z
本文链接:https://melodyvoid/Node/coding-problem.html
欢迎转载,转载请注明文本链接

坚持原创技术分享,您的支持将鼓励我继续创作!