本文会不断完善,也欢迎各位大佬一块儿“打磨”node
当咱们读一个文件的时候,能够指定以什么样的编码来读取web
fs.readFile('./test.txt','utf8',function(err,data){
console.log(data); //打印出来的就是编码后的字符串
})
复制代码
注意:bash
当咱们在桌面建立一个.txt时,默认编码是gb2312
,而又因为Node.js默认是不支持的,So咱们经过fs
读取到的buffer
是转换不成咱们想要的中文文字的。 webstorm
[warning] 注意: 即便将txt文件的后缀名更改成
.js
也是同样的。编辑器
咱们能够将文本另存为utf8
ui
这样虽然能让中文正常显示,但咱们发如今开始的位置却出现了乱码。 编码
这是为何呢?spa
在咱们使用unicode系编码的时,由于unicode编码有不少实现,So它会签个名,表示这个文件的是utf8编码的,归utf8管。这样咱们再使用编辑器打开的时候它就不会乱码code
what?! 编辑器打开都不乱码了,你娃娃node.js读文件toString还要乱码?orm
脚多麻的,让咱们换一个编辑器,嗯,webstorm
what?! 不乱码了?这是为何!!
嗯。。。不要方!不要方!真相只有一个!!
嘿!咱们仔细看,没乱码,但变成了一个点 `。
So这个问题有一个合理的推断,我大webstorm为Node.JS主持了公正!
是vscode私自致使的乱码,这锅不应Node.js小兄弟背而该让vscode背!
嗯。。。虽然webstorm中没有乱码,但无缘无故多了个 ` ,这也很差吧?
So,这个 ` 是什么?其实咱们上面已经说过,若是是unicode系的编码,都会在开头签个名,So这个 ` 就是和这个签名,这个字的16进制形式是长这样的
0xFEFF
复制代码
转换成buffer是长这样的
<Buffer ef bb bf>
复制代码
嗯。。。如今咱们知道它究竟是个什么鬼了,So干不干掉它不就是咱们几行代码的事?
let bf2 = fs.readFileSync(path.join(__dirname,'bom.txt'),'utf8');
let result = stripBOM(bf2);
console.log(result.toString());
// console.log(result);
function stripBOM(content){
if(Buffer.isBuffer(content)){
if(content[0]===0xEF&&content[1]===0xBB&&content[2]===0xBF){
return content.slice(3);
}
return content;
}else{ //是string
if(content.charCodeAt(0)===0xFEFF){
return content.slice(1);
}
return content;
}
}
复制代码
嗯,其实很简单,一个包的事
let iconv = require('iconv-lite');
let string = iconv.decode(须要转换的buffer,但愿用的编码方式)
console.log(string)
复制代码
咱们一般都是用utf8来编码的,utf8编码一个汉字等于3个字节,但有时候咱们不必定能一次性拿到完整的数据,可能先拿2个后拿4个,那么第一次拿的时候咱们输出出来就会产生乱码。
So咱们须要一个东东来帮咱们看着,当拿到的东西是一个汉字时要凑够3个字节才输出,不然就先攒着,这就是string_decoder
的做用之一。
let buffer = Buffer.from('阿弥陀佛');
let buff1 = buffer.slice(0,5);
let buff2 = buffer.slice(5);
let {StringDecoder} = require('string_decoder');
let sd = new StringDecoder();
console.log(sd.write(buff1).toString());
console.log(sd.write(buff2).toString());
复制代码