node中fs模块读取txt中文乱码?

const fs = require('fs')
fs.readFile('./test/1.txt','utf-8',function(err,dataStr){
    // console.log(err,dataStr);
    if(err){
     return console.log('读取文件失败' + err.message);
    }
    console.log('读取文件成功' + dataStr);
})

我发现了,我是先在文件夹中创建txt的,不是直接在vscode中创建txt,前面就会导致乱码,后面就不会,这个是啥道理

image.png

就是这样,我在桌面文件夹创建好,在来vscode看 就这样了

阅读 3.5k
2 个回答

应该是你文件夹创建的和 vscode 中创建的文件编码不一样。
vscode 中创建的默认是UTF-8编码的,文件夹中创建的,windows 估计是GB-2312之类的编码,可以点击 vscode 右下角有个编码的按钮,选择顶部的弹出框,Reopen with Encoding 看一下 vscode 的猜测编码。
image.png

解决的话,不用 utf-8 编码读取就好了,复杂点可以这么写

const fs = require('fs');
const languageEncoding = require("detect-file-encoding-and-language");
const iconv = require('iconv-lite');

languageEncoding('./temp.txt').then(fileInfo => {
  console.log(fileInfo);
  if (!iconv.encodingExists(fileInfo.encoding)) {
    throw new Error('不支持的文件编码');
  }
  fs.readFile('./temp.txt', (err, data) => {
    console.log(iconv.decode(data, fileInfo.encoding));
  });
});

用了detect-file-encoding-and-language来检测文件的编码,因为不知道 Node.js 支持的 readFile 的编码有哪些,所以用了iconv-lite来转换编码解码。

你readFile时选用的编码格式是'utf-8',读取的文件如果不是这个编码就会乱码,vscode创建的文件编码默认是utf-8,而电脑桌面直接创建的就不一定了,可以打开txt,在右下角看下编码
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏