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的设计模式
Nov 22 Javascript
什么是JavaScript
Aug 13 Javascript
js 得到文件后缀(通过正则实现)
Jul 08 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
Feb 14 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
js实现简单的二级联动效果
Mar 09 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 Javascript
BootstrapValidator实现表单验证功能
Nov 08 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP编程与应用
2006/10/09 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
php中Ctype函数用法详解
2014/12/09 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
php创建无限级树型菜单
2015/11/05 PHP
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
PHP echo()函数讲解
2019/02/15 PHP
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
canvas的神奇用法
2017/02/03 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
js实现动态时钟
2020/03/12 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现的归并排序算法示例
2017/11/21 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
python代码过长的换行方法
2018/07/19 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
关于期中考试的反思
2014/02/02 职场文书
小学生安全演讲稿
2014/04/25 职场文书
会议开幕词
2015/01/28 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS