在iOS混編的時候蔗喂,經(jīng)常會共用跨平臺文件,導入到xcode中高帖,有的格式就可能會識別不了缰儿,就會變成亂碼,比如說
GBK
散址,GB2312
(理論上有的文件xcode是可以識別的)乖阵。為了可以統(tǒng)一轉化這些文件的編碼,所以我就寫了一個node.js
的小樣预麸,下面貼出代碼瞪浸。在轉化之前需要一定的條件
1.node.js
的環(huán)境,網(wǎng)上有很多教程吏祸,安裝環(huán)境很簡單对蒲。
2.需要iconv-lite
這個插件,輸入npm install iconv-lite
就可以安裝了。
3.敢于嘗試的精神蹈矮。(略略略砰逻,其實我也是試出來的。)完整代碼
// 文件名 index.js
const fs = require('fs');
const path = require('path');
const iconv = require('iconv-lite');
console.log('爬蟲程序開始運行...')
var root = path.join(__dirname)
readDir(path.join(root))
console.log('爬蟲程序結束運行...')
function readDir(subPath){
fs.readdir(subPath,function(err,menu){
if(!menu)
return;
menu.forEach(function(ele){
fs.stat(subPath+"/"+ele,function(err,info){
if(info.isDirectory()){
readDir(subPath+"/"+ele);
}else{
// 先判斷后綴名
if (isContains(ele, '.h') ||
isContains(ele, '.hpp') ||
isContains(ele, '.cpp') ||
isContains(ele, '.c') ||
isContains(ele, '.m') ||
isContains(ele, '.mm')) {
transStr(subPath, ele)
}
}
})
})
})
}
// 判斷是是否包含字符串
function isContains(str, substr) {
return str.indexOf(substr) >= 0;
}
// 轉化文件中的編碼方式
function transStr(fontPath, subPath) {
var filePath = path.resolve(fontPath, subPath);
console.log("file: " + filePath)
var data = fs.readFileSync(filePath);
var change_data = iconv.decode(data,'gb2312');
var aie = iconv.encode(change_data,'utf8');
fs.writeFileSync(filePath, aie);
}
有哪個文件夾中的文件需要轉化泛鸟,那就把這個文件(
index.js
命名可以隨便)放在哪個文件夾或者是上一層蝠咆,只要在終端中,跳轉到當前的目錄下北滥,然后執(zhí)行node index.js
就可以了刚操。現(xiàn)在我們簡單的分析一下代碼的流程
1. 導入模塊
const fs = require('fs');
const path = require('path');
const iconv = require('iconv-lite');
- 導入需要用到的三個
node
的模塊,fs
是處理文件流的碑韵,path
是處理路徑的赡茸,iconv-lite
是進行編碼轉化的。
2. 獲取路徑
var root = path.join(__dirname)
readDir(path.join(root))
-
__dirname
獲得當前文件所在目錄的完整目錄名
3. 遍歷所有文件夾中的文件
function readDir(subPath){
fs.readdir(subPath,function(err,menu){
if(!menu)
return;
menu.forEach(function(ele){
fs.stat(subPath+"/"+ele,function(err,info){
if(info.isDirectory()){
readDir(subPath+"/"+ele);
}else{
// 先判斷后綴名
if (isContains(ele, '.h') ||
isContains(ele, '.hpp') ||
isContains(ele, '.cpp') ||
isContains(ele, '.c') ||
isContains(ele, '.m') ||
isContains(ele, '.mm')) {
transStr(subPath, ele)
}
}
})
})
})
}
- 這里是利用
遞歸
的方式來獲取文件夾的所有目錄的祝闻。 -
fs.readdir(path, [callback(err,files)])
以異步的方式讀取文件目錄占卧。 -
fs.stat(path, [callback(err, stats)])
獲取文件信息 - 在這里加了一個判斷,如果文件的后綴名是
.h .hpp .c .cpp .m .mm的
的時候联喘,才會進行編碼的轉化华蜒。
4. 轉化文件中的編碼方式
function transStr(fontPath, subPath) {
var filePath = path.resolve(fontPath, subPath);
console.log("file: " + filePath)
var data = fs.readFileSync(filePath);
var change_data = iconv.decode(data,'gb2312');
var aie = iconv.encode(change_data,'utf8');
fs.writeFileSync(filePath, aie);
}
- 最后一部分,才是本文的重點
-
path.resolve([from ...], to)
將參數(shù) to 位置的字符解析到一個絕對路徑里豁遭,這里解析出文件的絕對路徑叭喜。 -
fs.readFileSync(filename, [encoding])
異步獲取文件中的數(shù)據(jù)。 -
fs.writeFileSync(filename, data, [options])
異步將數(shù)據(jù)寫入到文件蓖谢。 -
iconv.decode() iconv.encode()
解碼和編碼數(shù)據(jù)的格式捂蕴,這里的gb2312 utf8
只是一個例子,還可以替換成其他的格式(比如gbk ISO-8859
)闪幽,這個就需要大家們的嘗試精神啥辨,因為有的時候我們也不知道他到底是什么編碼。