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下利用jsonp跨域访问实现方法
Jul 29 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 Javascript
Firefox中beforeunload事件的实现缺陷浅析
May 03 Javascript
写出高效jquery代码的19条指南
Mar 19 Javascript
javascript调试之DOM断点调试法使用技巧分享
Apr 15 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
Oct 17 Javascript
利用vue.js把静态json绑定bootstrap的table方法
Aug 28 Javascript
vue2.0项目集成Cesium的实现方法
Jul 30 Javascript
JSON stringify方法原理及实例解析
Oct 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静态类
2006/11/25 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
jquery 指南/入门基础
2007/11/30 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
Python中tell()方法的使用详解
2015/05/24 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
英国探险旅游专家:Explore
2018/12/20 全球购物
创伤外科专业推荐信范文
2013/11/19 职场文书
迟到检讨书500字
2014/02/05 职场文书
《称象》教学反思
2014/04/25 职场文书
二年级学生期末评语
2014/12/26 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript