详解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 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
Aug 27 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
使用Chart.js图表库制作漂亮的响应式表单
Oct 28 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
Aug 01 Javascript
详解Node.js开发中的express-session
May 19 Javascript
详解基于Vue+Koa的pm2配置
Oct 24 Javascript
vue--点击当前增加class,其他删除class的方法
Sep 15 Javascript
Puppet的一些技巧
Sep 17 Javascript
Angular封装搜索框组件操作示例
Apr 25 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 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 如何获取二维数组中某个key的集合
2014/06/03 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
原生js实现购物车功能
2020/09/23 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用Python中的cookielib模拟登录网站
2015/04/09 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
Python多线程和队列操作实例
2015/06/21 Python
python实现日常记账本小程序
2018/03/10 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python实现银行实战系统
2020/02/26 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
班主任高考寄语
2015/02/26 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang