文件批量字符编码转换工具

今天接到一个新项目,是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,所以我现在不会写脚本哈哈哈哈哈哈。

你可能感兴趣的:(文件批量字符编码转换工具)