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 相关文章推荐
图片完美缩放
Sep 07 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
May 29 Javascript
JavaScript中的console.group()函数详细介绍
Dec 29 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
vue 使用html2canvas将DOM转化为图片的方法
Sep 11 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
微信小程序 如何保持登录状态
Aug 16 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
vant 解决tab切换插件标题样式自定义的问题
Nov 13 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
全文搜索和替换
2006/10/09 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
基于empty函数的判断详解
2013/06/17 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
Python2.x中文乱码问题解决方法
2015/06/02 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
自愿离婚协议书范文2014
2014/10/12 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
离婚案件上诉状
2015/05/23 职场文书