详解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调试技巧解决样式问题的步骤分享
Mar 15 Javascript
javascript的parseFloat()方法精度问题探讨
Nov 26 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
May 28 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
javascript模拟php函数in_array
Apr 27 Javascript
基于javascript实现全屏漂浮广告
Mar 31 Javascript
深入理解JavaScript 函数
Jun 06 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
微信小程序 switch组件详解及简单实例
Jan 10 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python程序设计入门(2)变量类型简介
2014/06/16 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
python argparser的具体使用
2019/11/10 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
python 5个实用的技巧
2020/09/27 Python
戴尔美国官网:Dell
2016/08/31 全球购物
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2015元旦节寄语
2014/12/08 职场文书
工作能力自我评价2015
2015/03/05 职场文书
招商银行收入证明
2015/06/17 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
mysql 索引合并的使用
2021/08/30 MySQL