在iOS混編的時候,經(jīng)常會共用跨平臺文件,導(dǎo)入到xcode中,有的格式就可能會識別不了,就會變成亂碼,比如說
GBK
,GB2312
(理論上有的文件xcode是可以識別的)。為了可以統(tǒng)一轉(zhuǎn)化這些文件的編碼,所以我就寫了一個node.js
的小樣,下面貼出代碼。在轉(zhuǎn)化之前需要一定的條件
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('爬蟲程序結(jié)束運行...')
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;
}
// 轉(zhuǎn)化文件中的編碼方式
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);
}
有哪個文件夾中的文件需要轉(zhuǎn)化,那就把這個文件(
index.js
命名可以隨便)放在哪個文件夾或者是上一層,只要在終端中,跳轉(zhuǎn)到當(dāng)前的目錄下,然后執(zhí)行node index.js
就可以了。現(xiàn)在我們簡單的分析一下代碼的流程
1. 導(dǎo)入模塊
const fs = require('fs');
const path = require('path');
const iconv = require('iconv-lite');
- 導(dǎo)入需要用到的三個
node
的模塊,fs
是處理文件流的,path
是處理路徑的,iconv-lite
是進行編碼轉(zhuǎn)化的。
2. 獲取路徑
var root = path.join(__dirname)
readDir(path.join(root))
-
__dirname
獲得當(dāng)前文件所在目錄的完整目錄名
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的
的時候,才會進行編碼的轉(zhuǎn)化。
4. 轉(zhuǎn)化文件中的編碼方式
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
),這個就需要大家們的嘗試精神,因為有的時候我們也不知道他到底是什么編碼。