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 document.referrer 用法
Apr 30 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
May 13 Javascript
使用JavaScript+canvas实现图片裁剪
Jan 30 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
layui 表单标签的校验方法
Sep 04 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 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实时显示输出
2008/10/02 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
javascript生成大小写字母
2015/07/03 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
python3 读写文件换行符的方法
2018/04/09 Python
python中partial()基础用法说明
2018/12/30 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
python sqlite的Row对象操作示例
2019/09/11 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
pycharm导入源码的具体步骤
2020/08/04 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
车工岗位职责
2013/11/26 职场文书
采购主管的岗位职责
2013/12/17 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
springcloud整合seata
2022/05/20 Java/Android