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 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
通用javascript脚本函数库 方便开发
Oct 13 Javascript
基于jQuery的图片大小自动适应实现代码
Nov 17 Javascript
妙用Jquery的val()方法
Jun 27 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
JavaScript动态生成二维码图片
Apr 20 Javascript
微信小程序商城项目之淘宝分类入口(2)
Apr 17 Javascript
ES6学习教程之对象字面量详解
Oct 09 Javascript
微信小程序实现弹出层效果
May 26 Javascript
微信小程序关键字变色实现代码实例
Dec 13 Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 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扩展ZF――Validate扩展
2008/01/10 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
python opencv实现图像边缘检测
2019/04/29 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
python如何写个俄罗斯方块
2020/11/06 Python
python 从list中随机取值的方法
2020/11/16 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
家长给小学生的评语
2014/01/30 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技