详解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的闭包的一个示例说明
Nov 18 Javascript
JavaScript 异步方法队列链实现代码分析
Jun 05 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
js实现横向伸展开的二级导航菜单代码
Aug 28 Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
Oct 23 Javascript
npm全局模块卸载及默认安装目录修改方法
May 15 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
Nov 12 Javascript
通过angular CDK实现页面元素拖放的步骤详解
Jul 01 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
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.MVC的模板标签系统(二)
2006/09/05 PHP
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
python下os模块强大的重命名方法renames详解
2017/03/07 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
综合实践活动方案
2014/02/14 职场文书
数学检讨书1000字
2014/02/24 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
影子教师研修方案
2014/06/14 职场文书
大雁塔英文导游词
2015/02/10 职场文书
幼儿园个人总结
2015/02/28 职场文书
女性健康讲座主持词
2015/07/04 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
python pygame入门教程
2021/06/01 Python
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
SpringBoot Http远程调用的方法
2022/08/14 Java/Android