详解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 相关文章推荐
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
Mar 06 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
Nov 25 Javascript
用JS在浏览器中创建下载文件
Mar 05 Javascript
改变状态栏文字的js代码
Jun 13 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 Javascript
输入框跟随文字内容适配宽实现示例
Aug 14 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python实现kMeans算法
2017/12/21 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
教师爱岗敬业演讲稿
2014/05/05 职场文书
授权委托书怎么写
2014/09/25 职场文书
培训后的感想
2015/08/07 职场文书
领导干部学习心得体会
2016/01/23 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
Python OpenCV之常用滤波器使用详解
2022/04/07 Python