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 相关文章推荐
JavaScript 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
JQuery 小练习(实例代码)
Aug 07 Javascript
JQuery 操作select标签实现代码
May 14 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
JavaScript中pop()方法的使用教程
Jun 09 Javascript
jQuery+Ajax实现无刷新操作
Jan 04 Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
Jan 06 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
Oct 26 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
turn.js异步加载实现翻书效果
Jul 25 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
玩转虚拟域名◎+ .
2006/10/09 PHP
php实现的MySQL通用查询程序
2007/03/11 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
JavaScript入门基础
2015/08/12 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
如何在JavaScript中正确处理变量
2020/12/25 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
python制作mysql数据迁移脚本
2019/01/01 Python
python requests.post带head和body的实例
2019/01/02 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
个人素质的自我评价分享
2013/12/16 职场文书
工作保证书范文
2014/04/29 职场文书
单位授权委托书范本
2014/09/26 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
电信营业员岗位职责
2015/04/14 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python
golang定时器
2022/04/14 Golang