详解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代码
Oct 19 Javascript
JQuery for与each性能比较分析
May 14 Javascript
根据配置文件加载js依赖模块
Dec 29 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 Javascript
简单的js计算器实现
Oct 26 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
Dec 05 Javascript
Bootstrap基本样式学习笔记之图片(6)
Dec 07 Javascript
canvas绘制表盘时钟
Jan 23 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 Javascript
Vuex模块化应用实践示例
Feb 03 Javascript
vue中渲染对象中属性时显示未定义的解决
Jul 31 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 八种基本的数据类型小结
2011/06/01 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
从零开始封装自己的自定义Vue组件
2018/10/09 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
python3.0 字典key排序
2008/12/24 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
python开发中range()函数用法实例分析
2015/11/12 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
简单了解python反射机制的一些知识
2019/07/13 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
工商企业管理专业自荐信范文
2014/04/12 职场文书
工商干部先进事迹
2014/05/14 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
公证委托书标准格式
2014/09/11 职场文书
工程移交协议书
2016/03/24 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
MySQL系列之十一 日志记录
2021/07/02 MySQL
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript