详解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文件缓存之版本管理详解
Jul 05 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
Feb 15 Javascript
js实现鼠标拖动功能
Mar 20 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
微信小程序template模板与component组件的区别和使用详解
May 22 Javascript
vue 移动端注入骨架屏的配置方法
Jun 25 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
JS实现放烟花效果
Mar 10 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
如何判断php数组的维度
2013/06/10 PHP
php 实现进制相互转换
2016/04/07 PHP
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
Python中的With语句的使用及原理
2020/07/29 Python
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
90后毕业生的求职信范文
2013/09/21 职场文书
酒店服务实习自我鉴定
2013/09/22 职场文书
服装厂厂长岗位职责
2013/12/27 职场文书
八年级英语教学反思
2014/01/09 职场文书
魅力教师事迹材料
2014/01/10 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
出国留学计划书
2014/04/27 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
Python中的嵌套循环详情
2022/03/23 Python
Ruby处理YAML和json数据
2022/04/18 Ruby
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python