Node.js文件编码格式的转换的方法


Posted in Javascript onApril 27, 2018

项目很多 lua 文件不是 utf-8格式,使用 EditPlus 查看的时候,显示为ASCII。还有的是带BOM的,带BOM倒好处理,之前写过,有一定规律。

ASCII编码就比较蛋疼,通过搜索网上资源,反复测试对比,最终形成下面比较靠谱的方法(有一些 EditPlus显示编码为utf-8但node.js库返回的却是其它编码>_<)

判断修改是否无误,只需要在修改完之后,通过SVN提交,浏览提交列表,双击任意一项待提交文件,如果显示下图所示的对话框,则说明修改成功,其它都会看到中文反而变成乱码了

Node.js文件编码格式的转换的方法

var fs = require('fs');
var chardet = require('chardet');
var jschardet = require("jschardet");
var encoding = require("encoding");

var path = "lua目录";

function readDirectory(dirPath) {
  if (fs.existsSync(dirPath)) {
    var files = fs.readdirSync(dirPath);

    files.forEach(function (file) {
      var filePath = dirPath + "/" + file;
      var stats = fs.statSync(filePath);

      if (stats.isDirectory()) {
        // console.log('/n读取目录:\n', filePath, "\n");
        readDirectory(filePath);
      } else if (stats.isFile() && /\.lua$/.test(filePath)) {
        var buff = fs.readFileSync(filePath);
        if (buff.length && buff[0].toString(16).toLowerCase() == "ef" && buff[1].toString(16).toLowerCase() == "bb" && buff[2].toString(16).toLowerCase() == "bf") {
          //EF BB BF 239 187 191
          console.log('\n发现BOM文件:', filePath, "\n");

          buff = buff.slice(3);
          fs.writeFile(filePath, buff.toString(), "utf8");
        }

        // { encoding: 'UTF-8', confidence: 0.99 }
        // var charset = chardet.detectFileSync(filePath);
        var info = jschardet.detect(buff);

        if (info.encoding == "GB2312" || info.encoding == "ascii") {
          var resultBuffer = encoding.convert(buff, "UTF-8", info.encoding);
          fs.writeFile(filePath, resultBuffer, "utf8");
        }
        else if (info.encoding != "UTF-8" && chardet.detectFileSync(filePath) != "UTF-8")
        {
          if (buff.toString().indexOf("\r\n") > -1)
          {
            var resultBuffer = encoding.convert(buff, "UTF-8", "GBK");
            fs.writeFile(filePath, resultBuffer, "utf8");
          }
        }
      }
    });

  } else {
    console.log('Not Found Path : ', dirPath);
  }
}

readDirectory(path);

注意上面的判断,第一个明确是 GB2312或者ascii时,直接将相应的编码转为 utf-8。而如果返回是格式,先判断是否有PC下的换行符,如果有则全部将它视为GBK进行处理。

整个思路其实是比较简单,难点在于如果判断文件编码格式。这个真的很难>_<,获取原编码格式后,调用 encoding.convert(buff, 目标编码格式 , 原始编码格式 ); 便可得到所需要的编码。如果有空而且有兴趣,可以下载Notepad++的源码,看它是如何判断文件的编码格式

注:上面的方法所修改的文件,跟 Mac 上需要提交的文件列表是一致的,至少能解决我目前遇到的问题。如果有特殊的,可对上面的代码进行修正。

用到的第三方库:

encoding https://github.com/andris9/encoding
jschardet https://github.com/aadsm/jschardet
node-chardet https://github.com/runk/node-chardet

编码相关的基础知识,可以参考这篇文章: https://3water.com/article/31045.htm

维基百科和其它资料太过专业化了,而且对 ASCII 编码的介绍不多,不再一一列举出来了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
js对象转json数组的简单实现案例
Feb 28 Javascript
js处理php输出时间戳对不上号的解决方法
Jun 20 Javascript
jQuery 弹出层插件(推荐)
May 24 Javascript
全面解析Javascript无限添加QQ好友原理
Jun 15 Javascript
Javascript+CSS3实现进度条效果
Oct 28 Javascript
JavaScript简单计算人的年龄示例
Apr 15 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
node.js连接mysql与基本用法示例
Jan 05 Javascript
CKeditor4 字体颜色功能配置方法教程
Jun 26 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
Apr 27 #jQuery
基于Vue实现拖拽效果
Apr 27 #Javascript
Node.js利用console输出日志文件的方法示例
Apr 27 #Javascript
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 #Javascript
使用Vue动态生成form表单的实例代码
Apr 26 #Javascript
Javascript的console['']常用输入方法汇总
Apr 26 #Javascript
r.js来合并压缩css文件的示例
Apr 26 #Javascript
You might like
js代码实现微博导航栏
2015/07/30 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
JavaScript内核之基本概念
2011/10/21 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
Python基于PycURL实现POST的方法
2015/07/25 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
CSS3盒子模型详解
2013/04/24 HTML / CSS
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
初中生物教学反思
2014/01/10 职场文书
产品质量承诺范本
2014/03/31 职场文书
大学生求职信例文
2014/06/29 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
保险公司演讲稿
2014/09/02 职场文书
流动人口婚育证明
2014/10/19 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
办公室个人总结
2015/02/28 职场文书
网聊搭讪开场白
2015/05/28 职场文书
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server