今天接到一个新项目,是windows上面的Android项目,之前先后经历过两个同事的开发,A同事采用默认的字符编码,即GBK,B同事的代码用UTF-8。最后我在mac上导成AS之后出现了乱码,所以需要统一转换成UTF-8,身为一枚程序员,当然不能手动修改了,所以写了一下一个文件遍历转码工具类。
整体思路
- 检查当前文件编码,如果不是目标编码,则将文件内容从当前编码转换成目标编码。
- 用指定编码的方式读取一个文件,结果变成流。
第二步简单,问题是第一步如何判断当前文件的编码格式,这个时候我们可以借助一个工具,叫做ICU4J,是一个开源库,不过不在github,下载地址戳这里,下载操作示范如图一、图二
如果你是使用AS开发的,可以建一个Android library的module,注意不要建Java library,不然添加jar包之后运行会出现找不到类的异常,我也不清楚为什么。。。
代码如下:
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);
//将流数据转换成目标编码格式的文件
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环境,并且要有IDE
所以还是可以继续优化的,比如用一个脚本包装上面的操作,比如用ICU4C(C语言支持库),这样就不需要要求用户要有Java环境了。不过我还在学Python,所以我现在不会写脚本哈哈哈哈哈哈。