今天接到一個新項目,是windows上面的Android項目,之前先后經歷過兩個同事的開發(fā)扰魂,A同事采用默認的字符編碼怖现,即GBK,B同事的代碼用UTF-8十嘿。最后我在mac上導成AS之后出現(xiàn)了亂碼被环,所以需要統(tǒng)一轉換成UTF-8,身為一枚程序員详幽,當然不能手動修改了筛欢,所以寫了一下一個文件遍歷轉碼工具類。
整體思路
- 檢查當前文件編碼唇聘,如果不是目標編碼版姑,則將文件內容從當前編碼轉換成目標編碼。
- 用指定編碼的方式讀取一個文件迟郎,結果變成流剥险。
第二步簡單,問題是第一步如何判斷當前文件的編碼格式宪肖,這個時候我們可以借助一個工具表制,叫做ICU4J健爬,是一個開源庫,不過不在github么介,下載地址戳這里娜遵,下載操作示范如圖一、圖二
如果你是使用AS開發(fā)的壤短,可以建一個Android library的module设拟,注意不要建Java library,不然添加jar包之后運行會出現(xiàn)找不到類的異常久脯,我也不清楚為什么纳胧。。帘撰。
代碼如下:
package com.mango.mylibrary;
import com.ibm.icu.text.CharsetDetector;
import com.ibm.icu.text.CharsetMatch;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
/**
* 將文件內容轉換成目標編碼格式文件
*
* @throws Exception
*/
public static void convert(File f, String desEncode) throws Exception {
File files[] = f.listFiles();
for (File file : files) {
if (file.isDirectory()) {
convert(file, desEncode);
continue;
}
FileInputStream in = new FileInputStream(file);
byte[] bytes = Main.readInputSream(in);
//獲得當前文件的編碼格式
String encode = Main.getEncode(bytes);
in.close();
if (!encode.equalsIgnoreCase(desEncode)) {
in = new FileInputStream(file);
//用文件本身的編碼格式跑慕,將文件轉成流
BufferedReader reader = new BufferedReader(new InputStreamReader(in, encode));
String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
reader.close();
file.delete();
FileOutputStream out = new FileOutputStream(file);
//將流數(shù)據轉換成目標編碼格式的文件
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, desEncode));
writer.write(sb.toString());
writer.close();
}
}
}
public static byte[] readInputSream(InputStream in) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
in.close();
return baos.toByteArray();
}
public static String getEncode(byte[] bytes){
CharsetDetector detector = new CharsetDetector();
detector.setText(bytes);
CharsetMatch match = detector.detect();
String encode = match.getName();
return encode;
}
public static void main(String[] args) {
try {
//這里更換成你想轉換的文件頂級目錄,會遞歸遍歷子目錄文件的
File f = new File("/Users/mango/Desktop/runcobber");
Main.convert(f, "gbk");
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后在Main類文件右鍵摧找,在彈出的窗口點擊"Run"即可核行,如圖三所示
本文到這里就結束了,但是有幾個方面還是不好慰于,比如
- 要求用戶要有java環(huán)境钮科,并且要有IDE
所以還是可以繼續(xù)優(yōu)化的,比如用一個腳本包裝上面的操作婆赠,比如用ICU4C(C語言支持庫)绵脯,這樣就不需要要求用戶要有Java環(huán)境了。不過我還在學Python休里,所以我現(xiàn)在不會寫腳本哈哈哈哈哈哈蛆挫。