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


Posted in NodeJs onOctober 10, 2018

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解码。

NodeJs 相关文章推荐
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 #NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 #NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 #NodeJs
nodejs初始化init的示例代码
Oct 10 #NodeJs
webpack打包nodejs项目的方法
Sep 26 #NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 #NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 #NodeJs
You might like
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
jQuery代码优化 事件委托篇
2011/11/01 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
Python正则捕获操作示例
2017/08/19 Python
django解决跨域请求的问题
2018/11/11 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
python全局变量引用与修改过程解析
2020/01/07 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
申报职称专业技术个人的自我评价
2013/12/12 职场文书
打架检讨书800字
2014/01/10 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
预备党员表决心书
2014/03/11 职场文书
项目合作协议书
2014/04/16 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
给客户的检讨书
2014/12/21 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
公司业务员管理制度
2015/08/05 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书