项目很多 lua 文件不是 utf-8格式,使用 EditPlus 查看的时候,显示为ASCII。还有的是带BOM的,带BOM倒好处理,之前写过,有一定规律。

ASCII编码就比较蛋疼,通过搜索网上资源,反复测试对比,最终形成下面比较靠谱的方法(有一些 EditPlus显示编码为utf-8但node.js库返回的却是其它编码>_<)

判断修改是否无误,只需要在修改完之后,通过SVN提交,浏览提交列表,双击任意一项待提交文件,如果显示下图所示的对话框,则说明修改成功,其它都会看到中文反而变成乱码了

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 上需要提交的文件列表是一致的,至少能解决我目前遇到的问题。如果有特殊的,可对上面的代码进行修正。

用到的第三方库:

编码相关的基础知识,可以参考阮一峰的这篇文章:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

维基百科和其它资料太过专业化了,而且对 ASCII 编码的介绍不多,不再一一列举出来了。

Node.js文件编码格式的转换的更多相关文章

  1. Node.js文件操作二

    前面的博客 Node.js文件操作一中主要是对文件的读写操作,其实还有文件这块还有一些其他操作. 一.验证文件path是否正确(系统是如下定义的) fs.exists = function(path, ...

  2. Linux下dos2unix命令将windows文件编码格式dos转换成Unix格式

    问题描述: 在Windows系统下面使用文本编辑器notepad后传到Linux系统下的话 Linux下处理和执行一般都存在一些问题,我们可以通过命令查看文件是否是dos格式的, 如果有如图所示的M标 ...

  3. Node.js 文件上传 cli tools

    Node.js 文件上传 cli tools byte stream 断点续传 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. Node.js文件操作一

    Node.js和其他语言一样,也有文件操作.先不说node.js中的文件操作,其他语言的文件操作一般也都是有打开.关闭.读.写.文件信息.新建删除目录.删除文件.检测文件路径等.在node.js中也是 ...

  5. Node.js 文件输入

    最近在尝试用 JavaScript (Node.js) 写题.为此,特地看了 ECMAScript 2017 Language Specification(大雾).写题一般是从文件输入,确切地说是,将 ...

  6. Node.js文件上传

    Node.js express使用Multer实现文件上传html部分 <div> <h3>文件上传:</h3> 选择一个文件上传: <br/> < ...

  7. Node.js 文件操作

    1.新建一个文件a.txt,并写入"你好,这是一个新文件.". writeFile 代码 demo1.js var fs = require('fs'); console.log( ...

  8. Node.js 文件夹目录结构创建

    第一次接触NodeJS的文件系统就被它的异步的响应给搞晕了,后来发现NodeJS判断文件夹是否存在和创建文件夹是还有同步方法的,但是还是想尝试使用异步的方法去实现. 使用的方法:fs.exists(p ...

  9. node.js在windows下的学习笔记(9)---文件I/O模块

    开发中我们经常会有文件I/O的需求,node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装. 1.将"hello world" ...

随机推荐

  1. Kudu的卸载(cdh)

    卸载kudu 1):删除kudu相关包 rm -rf $(find / -name "*kudu*") 2):卸载kudu相关依赖 查询节点的kudu依赖: rpm -qa | g ...

  2. pyqt5界面使用

    安装配置了pyuic和pyrcc后再进行下面操作 1.打开:       位置(我的):C:\Users\AppData\Roaming\Python\Python35\site-packages\p ...

  3. Python学习(八) —— 内置函数和匿名函数

    一.递归函数 定义:在一个函数里调用这个函数本身 递归的最大深度:997 def func(n): print(n) n += 1 func(n) func(1) 测试递归最大深度 import sy ...

  4. JMeter学习笔记2-图形界面简单介绍

    废话少说直接干活的给: 一.打开和运行JMeter,出现UI界面.如图下所示: 工具栏:常见操作的图标集合,有New(新建), Template(模板) ,Save(保存),Start(开始) ,St ...

  5. 最短路径(给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。)

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 例: 输入: [ [1,3,1], [1,5,1], [ ...

  6. ML激活函数使用法则

    sigmoid .tanh .ReLu tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数. 基本已经不用 sigmoid 激活函数了,tanh 函数在所有场合都优于 sig ...

  7. python3解析库lxml

    阅读目录 1.python库lxml的安装 2.XPath常用规则 (1)读取文本解析节点 (2)读取HTML文件进行解析 (3)获取所有节点 (4)获取子节点 (5)获取父节点 (6)属性匹配 (7 ...

  8. HDU 1022 火车进站【栈】

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目大意: 题目大概意思:有N辆火车,以序列1方式进站,判断是否能以序列2方式出栈.进站不一定 ...

  9. NIO缓冲区基本操作:rewind(),clear(),flip()

    rewind() rewind()方法将position置0,清除mark,它的作用在于为提取Buffer的有效数据做准备. ByteBuffer byteBuf = ByteBuffer.alloc ...

  10. vs2008单元测试

    调试是解决错误的过程,测试是发现软件缺陷的过程.每一个软件在交付使用时前都必须经过测试.软件测试是软件开发的重要组成部分,现在已经发展成专门的技术. 在消除了程序中的语法错误和运行错误后,程序仍然不能 ...