nodejs读取本地中文json文件出现乱码

本文介绍了在Node.js中读取包含中文的UTF-8 JSON文件时可能出现的乱码问题及其解决方案。首先,确认文件是否以UTF-8无BOM编码,因为Node.js不会自动去除BOM。可以使用NPM模块去除BOM或手动处理。其次,检查JSON格式是否有误,如缺少或多余的逗号。此外,注意Node.js代码文件本身应以UTF-8编码,否则可能在写入中文时产生乱码。在确保文件编码正确的情况下,直接以utf8格式读取文件即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:

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
http://stackoverflow.com/a/24376813


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

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


以下来自http://blog.youkuaiyun.com/youbl/article/details/29812669:

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

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

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

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 参数file,必须保存为utf8格式,否则里面的中文会乱码  
  2. function readFile(file){  
  3.     // readFile的第2个参数表示读取编码格式,如果未传递这个参数,表示返回Buffer字节数组  
  4.     fs.readFile(file, "utf8"function(err, data){  
  5.         if(err)  
  6.             console.log("读取文件fail " + err);  
  7.         else{  
  8.             // 读取成功时  
  9.             console.log(data);// 直接输出中文字符串了  
  10.         }  
  11.     });  
  12. }  

以下来自http://www.lai18.com/content/351104.html?from=cancel


1、nodejs读取中文文件编码问题
准备一个文本文件(当然也可以是csv文件等)test.txt和text.csv,nodejs文件test.js如下:

[js]  view plain copy
  1. var iconv = require('iconv-lite');  
  2.   
  3. var fs = require('fs');  
  4. var fileStr = fs.readFileSync('D:\\test.csv', {encoding:'binary'});  
  5.   
  6. var buf = new Buffer(fileStr, 'binary');  
  7.   
  8. var str = iconv.decode(buf, 'GBK');  
  9. console.log(str);  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值