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 相关文章推荐
jquery控制listbox中项的移动并排序
Nov 12 Javascript
图片延迟加载的实现代码(模仿懒惰)
Mar 29 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
Jun 27 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
Jun 20 Javascript
使用delegate方法为一个tr标签加一个链接
Jun 27 Javascript
jQuery中append()方法用法实例
Dec 25 Javascript
js判断某个方法是否存在实例代码
Jan 10 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
Sep 01 jQuery
小程序和web画三角形实现解析
Sep 02 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
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
鼠标图片振动代码
2006/07/06 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
js格式化时间小结
2014/11/03 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
分享一个常用的Python模拟登陆类
2015/03/29 Python
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python模块的加载讲解
2019/01/15 Python
Python os.access()用法实例
2019/02/18 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
庆八一活动方案
2014/01/25 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
2015政治思想表现评语
2015/03/25 职场文书
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫