详解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 相关文章推荐
jquery 学习之二 属性 文本与值(text,val)
Nov 25 Javascript
javascript代码加载优化方法
Jan 30 Javascript
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
jquery选择器之属性过滤选择器详解
Jan 27 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
Mar 13 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
May 29 Javascript
JS实现CheckBox复选框全选全不选功能
May 06 Javascript
JavaScript学习笔记之数组去重
Mar 23 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
通过npm引用的vue组件使用详解
Mar 02 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 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相当简单的分页类
2008/10/02 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
brook javascript框架介绍
2011/10/10 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
资产评估专业学生的自我鉴定
2013/11/14 职场文书
销售部主管岗位职责
2013/12/18 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
个人授权委托书样本
2014/09/13 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
历史博物馆观后感
2015/06/05 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang