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中的事件
Sep 23 Javascript
有关DOM元素与事件的3个谜题
Nov 11 Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 Javascript
jQuery+css+html实现页面遮罩弹出框
Mar 21 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
Jun 01 Javascript
jQuery对象的链式操作用法分析
May 10 Javascript
js显示动态时间的方法详解
Aug 20 Javascript
js实现一键复制功能
Mar 16 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 Javascript
vue实现分页栏效果
Jun 28 Javascript
微信小程序实现点击图片放大预览
Oct 21 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 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/05/06 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP中header用法小结
2016/05/23 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
chrome调试javascript详解
2015/10/21 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
python实现得到一个给定类的虚函数
2014/09/28 Python
推荐11个实用Python库
2015/01/23 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
python语音识别实践之百度语音API
2018/08/30 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
keras中的backend.clip用法
2020/05/22 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
英文自荐信格式
2013/11/28 职场文书
大学生演讲稿范文
2014/01/11 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
档案工作个人总结
2015/03/03 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
浅谈Web Storage API的使用
2021/06/23 Javascript