详解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 第二代身份证号码的验证机制代码
May 12 Javascript
jQuery插件的写法分享
Jun 12 Javascript
jQuery Form 页面表单提交的小例子
Nov 15 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
Jan 06 Javascript
angular学习之从零搭建一个angular4.0项目
Jul 10 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
React从react-router路由上做登陆验证控制的方法
May 10 Javascript
ES6模板字符串和标签模板的应用实例分析
Jun 25 Javascript
layer 关闭指定弹出层的例子
Sep 25 Javascript
vue treeselect获取当前选中项的label实例
Aug 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 iconv() : Detected an illegal character in input string
2010/12/05 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
详解php命令注入攻击
2019/04/06 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
简单的js分页脚本
2009/05/21 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python抓取网页中链接的静态图片
2018/01/29 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
ddl,dml和dcl的含义
2016/05/08 面试题
儿科护士自我鉴定
2013/10/14 职场文书
工作自荐信
2013/12/11 职场文书
八一建军节活动方案
2014/02/10 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android