详解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 表单下所有元素的隐藏
Jul 25 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
Nov 23 Javascript
20分钟轻松创建自己的Bootstrap站点
May 12 Javascript
ES6中Math对象的部分扩展
Feb 20 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
史上最全JavaScript常用的简写技巧(推荐)
Aug 17 Javascript
react 父组件与子组件之间的值传递的方法
Sep 14 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 Javascript
[原创]微信小程序获取网络类型的方法示例
Mar 01 Javascript
vue接通后端api以及部署到服务器操作
Aug 13 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 print EOF实现方法
2009/05/21 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
php建立Ftp连接的方法
2015/03/07 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
php常用数组函数实例小结
2016/12/29 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
PHP7 新增常量
2021/03/09 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
JsDom 编程小结
2011/08/09 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
python实现字典嵌套列表取值
2019/12/16 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
Python实现ATM系统
2020/02/17 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
数据库面试要点基本概念
2013/10/31 面试题
2014年财务经理工作总结
2014/12/08 职场文书
新教师个人总结
2015/02/06 职场文书
计划生育工作总结2015
2015/04/03 职场文书
植树节新闻稿
2015/07/17 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis