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 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
超轻量级的基于jquery的三级展开列表
Apr 26 Javascript
常用jQuery代码分享
Jul 14 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
聊一聊JS中的prototype
Sep 29 Javascript
AngularJS ng-repeat数组有重复值的解决方法
Oct 23 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 Javascript
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
Aug 13 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
Aug 20 Javascript
微信小程序时间标签和时间范围的联动效果
Feb 15 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
用php将任何格式视频转为flv的代码
2009/09/03 PHP
PHP 防恶意刷新实现代码
2010/05/16 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
浅析JS运动
2015/12/28 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
JS回调函数深入理解
2019/10/16 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
python实现代码统计程序
2019/09/19 Python
python中bytes和str类型的区别
2019/10/21 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
python函数定义和调用过程详解
2020/02/09 Python
python selenium操作cookie的实现
2020/03/18 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
运动会通讯稿500字
2014/02/20 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
2015年宣传工作总结
2015/04/08 职场文书
Python合并多张图片成PDF
2021/06/09 Python