欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nodejs读取本地中文json文件出现乱码解决方法

程序员文章站 2022-06-11 15:53:02
1. 确定json文件是utf-8 无bom编码的的。如果有bom,会在读取第一行的时候出现乱码。 per "fs.readfilesync(filename,...

1. 确定json文件是utf-8 无bom编码的的。如果有bom,会在读取第一行的时候出现乱码。

per "fs.readfilesync(filename, 'utf8') doesn't strip bom markers #1918", fs.readfile is
working as designed: bom is not stripped from the header of the utf-8 file, if it exists. it at the discretion of the developer to handle this.

possible workarounds:

  • data= data.replace(/^\ufeff/, ''); perhttps://github.com/joyent/node/issues/1918#issuecomment-2480359
  • transform the incoming stream to remove the bom header with the npm module bomstrip perhttps://github.com/joyent/node/issues/1918#issuecomment-38491548

what you are getting is the byte order mark header (bom) of the utf-8 file. when json.parse sees
this, it gives an syntax error (read: "unexpected character" error). you must strip the byte order mark from the file before passing it to json.parse:

fs.readfile('./myconfig.json', 'utf8', function (err, data) {
  myconfig = json.parse(data.tostring('utf8').replace(/^\ufeff/, ''));
});
// note: data is an instance of buffer

2. 确定json没有格式错误。我在用utf8编码并用utf8 encoding来读取文件之后依然报错,百思不得其解。

最后发现json有两个editor没有发现的格式错误,一个是一个数组中两个元素之间少了一个“,”,另一个是另一个数组最后多了一个“,”。

注1:node的iconv模块,仅支持linux,不支持windows,因此要用纯js的iconv-lite,另:作者说iconv-lite的性能更好,具体参考git站点:iconv-lite

注2:我在测试读写文件时,始终无法把中文写入文件,一直乱码,读取正常,后来同事帮我发现:js文件的编码格式是ansi,nodejs的代码文件必须是utf8格式

注3:如果程序操作的文件,都是以utf8编码格式保存的,那么就不需要使用iconv模块,直接以utf8格式读取文件即可,如:

// 参数file,必须保存为utf8格式,否则里面的中文会乱码  
function readfile(file){  
    // readfile的第2个参数表示读取编码格式,如果未传递这个参数,表示返回buffer字节数组  
    fs.readfile(file, "utf8", function(err, data){  
        if(err)  
            console.log("读取文件fail " + err);  
        else{  
            // 读取成功时  
            console.log(data);// 直接输出中文字符串了  
        }  
    });  
}

nodejs读取中文文件编码问题

准备一个文本文件(当然也可以是csv文件等)test.txt和text.csv,nodejs文件test.js如下:

var iconv = require('iconv-lite');  
  
var fs = require('fs');  
var filestr = fs.readfilesync('d:\\test.csv', {encoding:'binary'});  
  
var buf = new buffer(filestr, 'binary');  
  
var str = iconv.decode(buf, 'gbk');  
console.log(str);  

直接读文件的话是乱码,不信你可以试试。需要先统一用二进制编码方式读取,然后再用gbk解码。