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 相关文章推荐
js动态设置div的值下例子
Oct 29 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
js常用数组操作方法简明总结
Jun 20 Javascript
浅谈JS日期(Date)处理函数
Dec 07 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
JavaScript判断变量是否为数组的方法(Array)
Feb 24 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
JS基于开关思想实现的数组去重功能【案例】
Feb 18 Javascript
小程序分页实践之编写可复用分页组件
Jul 18 Javascript
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
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&amp;&amp;mysql)六
2006/10/09 PHP
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
python绘制地震散点图
2019/06/18 Python
详解Python IO口多路复用
2020/06/17 Python
Python打印不合法的文件名
2020/07/31 Python
python exit出错原因整理
2020/08/31 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
有创意的广告词
2014/03/18 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
运动会跳远广播稿
2015/08/19 职场文书
《认识年月日》教学反思
2016/02/19 职场文书