详解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 ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
JQuery 选择和过滤方法代码总结
Nov 19 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
Jquery AJAX POST与GET之间的区别
Nov 14 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
Oct 20 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
Mar 23 Javascript
跟我学习javascript的最新标准ES6
Nov 20 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
微信小程序 rich-text的使用方法
Aug 04 Javascript
vue+express 构建后台管理系统的示例代码
Jul 19 Javascript
vue+echarts实现多条折线图
Mar 21 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
codeigniter框架批量插入数据
2014/01/09 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
PHP 实现重载
2021/03/09 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
jQuery 学习 几种常用方法
2009/06/11 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
python实现高斯投影正反算方式
2020/01/17 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
爱祖国演讲稿
2014/05/04 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
在职证明书模板
2015/06/15 职场文书
离职信范本
2015/06/23 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android