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 相关文章推荐
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
Dec 12 Javascript
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
DOM节点删除函数removeChild()用法实例
Jan 12 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
May 17 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
JS中用try catch对代码运行的性能影响分析
Dec 26 Javascript
bootstrap table 多选框分页保留示例代码
Mar 08 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
微信小程序sessionid不一致问题解决
Aug 30 Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 Javascript
关于Vue中的options选项
Mar 22 Vue.js
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
php邮件发送,php发送邮件的类
2011/03/24 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
ThinkPHP分页实例
2014/10/15 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP的PDO连接讲解
2019/01/24 PHP
document.compatMode介绍
2009/05/21 Javascript
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
jQuery $.each的用法说明
2010/03/22 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
深入学习Python中的装饰器使用
2016/06/20 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
解析Python的缩进规则的使用
2019/01/16 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
动漫设计与制作专业推荐信
2014/07/07 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
党性修养心得体会2016
2016/01/21 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技