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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
Javascript typeof 用法
Dec 28 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
May 27 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
May 06 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
Dec 16 Javascript
jQuery中extend函数的实现原理详解
Feb 03 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
Vue.js基础学习之class与样式绑定
Mar 20 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
JavaScript类型相关的常用操作总结
Feb 14 Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 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 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
php实现Mysql简易操作类
2015/10/11 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
python3.7.0的安装步骤
2018/08/27 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
python speech模块的使用方法
2020/09/09 Python
详解python程序中的多任务
2020/09/16 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
保密工作实施方案
2014/02/24 职场文书
家长会主持词
2014/03/26 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
经理岗位职责范本
2015/04/15 职场文书
员工离职通知函
2015/04/25 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
详解MySQL中的主键与事务
2021/05/27 MySQL
Python面向对象之成员相关知识总结
2021/06/24 Python
Python中三种花式打印的示例详解
2022/03/19 Python
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏