详解Node.js读写中文内容文件操作


Posted in Javascript onOctober 10, 2018

由于Node.js仅支持如下编码:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB2312之类的编码,

因此如果要读写GBK或GB2312格式的文件的中文内容,必须要用额外的模块:iconv-lite

1、安装模块:npm install iconv-lite

2、演示代码,把下面的代码复制到一个文件中,假设是ch.js(注意:js文件必须保存为utf8编码格式):

// 加载File System读写模块
var fs = require('fs');
// 加载编码转换模块
var iconv = require('iconv-lite'); 
 
var file = "c:\\a.txt";
writeFile(file);
readFile(file);
 
function writeFile(file){
 // 测试用的中文
 var str = "\r\n我是一个人Hello myself!";
 // 把中文转换成字节数组
 var arr = iconv.encode(str, 'gbk');
 console.log(arr);
 
 // appendFile,如果文件不存在,会自动创建新文件
 // 如果用writeFile,那么会删除旧文件,直接写新文件
 fs.appendFile(file, arr, function(err){
  if(err)
   console.log("fail " + err);
  else
   console.log("写入文件ok");
 });
}
 
function readFile(file){
 fs.readFile(file, function(err, data){
  if(err)
   console.log("读取文件fail " + err);
  else{
   // 读取成功时
   // 输出字节数组
   console.log(data);
   // 把数组转换为gbk中文
   var str = iconv.decode(data, 'gbk');
   console.log(str);
  }
 });
}

3、用node.exe执行这个js文件,结果如下:

C:\>node ch.js
<Buffer 0d 0a ce d2 ca c7 d2 bb b8 f6 c8 cb 48 65 6c 6c 6f 20 6d 79 73 65 6c 66 21>
写入文件ok
<Buffer 0d 0a ce d2 ca c7 d2 bb b8 f6 c8 cb 48 65 6c 6c 6f 20 6d 79 73 65 6c 66 21>
 
我是一个人Hello myself!
 
C:\>

注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);// 直接输出中文字符串了
  }
 });
}

结论:使用node.js开发时,无论是代码文件,还是要读写的其它文件,都建议使用UTF8编码格式保存,这样可以无需额外的模块支持

Javascript 相关文章推荐
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 Javascript
javascript实现微信分享
Dec 23 Javascript
JS实现模拟风力的雪花飘落效果
May 13 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
微信小程序实现表单校验功能
Mar 30 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
Jun 04 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
Jul 24 Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 Javascript
angular6的响应式表单的实现
Oct 10 #Javascript
JS原生带缩略图的图片切换效果
Oct 10 #Javascript
js实现前面自动补全位数的方法
Oct 10 #Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 #Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
Oct 10 #Javascript
解决eclipse中没有js代码提示的问题
Oct 10 #Javascript
js实现同一个页面,多个enter事件绑定的示例
Oct 10 #Javascript
You might like
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
测试php函数的方法
2013/11/13 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
Python深入学习之闭包
2014/08/31 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
python3中确保枚举值代码分析
2020/12/02 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
几个人围成一圈的问题
2013/09/26 面试题
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
会计学应届毕业生推荐信
2013/11/04 职场文书
工程师岗位职责规定
2014/02/26 职场文书
应聘教师求职信
2014/07/19 职场文书
公司离职证明范本
2014/10/17 职场文书
2014年仓库工作总结
2014/11/20 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
同学联谊会邀请函
2019/06/24 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
JavaScript实现优先级队列
2021/12/06 Javascript