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 相关文章推荐
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
javascript中expression的用法整理
May 13 Javascript
jQuery学习心得总结(必看篇)
Jun 10 Javascript
javascript history对象详解
Feb 09 Javascript
TypeScript入门-基本数据类型
Mar 28 Javascript
微信小程序实现滑动删除效果
May 19 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
Aug 14 Javascript
jquery获取链接地址和跳转详解(推荐)
Aug 15 jQuery
详解SPA中前端路由基本原理与实现方式
Sep 12 Javascript
解决Vue打包上线之后部分CSS不生效的问题
Nov 12 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
JavaScript实现页面动态验证码的实现示例
Mar 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连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
Django 路由系统URLconf的使用
2018/10/11 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
如何通过python计算圆周率PI
2020/11/11 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
网页设计个人找工作求职信
2013/11/28 职场文书
医院总经理岗位职责
2014/02/04 职场文书
模范家庭事迹材料
2014/02/10 职场文书
村级换届选举方案
2014/05/10 职场文书
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS
LeetCode189轮转数组python示例
2022/08/05 Python