美文网首页
文件批量字符编码转换工具

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

作者: Little_Mango | 来源:发表于2018-01-02 16:15 被阅读19次

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

相关文章

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

    今天接到一个新项目,是windows上面的Android项目,之前先后经历过两个同事的开发,A同事采用默认的字符编...

  • 部分知识点

    chr(编码值) - 将字符编码转换成字符 ord(字符) - 获取字符对应的编码值 可以将字符编码放到字符串中便...

  • Pytho基础知识:字符编码

    阅读目录一、字符编码 1、什么实字符编码:将人识别的字符转换成计算机能识别的01,而转换的过程或者规则就是字符编码...

  • 常用函数记录

    字符串编码转换函数:

  • Python正式课第十三天

    一、文件操作与字符编码 1. 字符编码 编码 将字符转换为对应的二进制序列的过程叫做字符编码(字符->二进制01)...

  • Unicode编码和多字节编码

    wchar_t:unicode编码的字符char:多字节编码的字符TCHAR:根据环境转换字符类型的字符 "hel...

  • js 16进制转中文

    转换为中文字符串 转换为unicode编码

  • 一些用到的网址

    在线转码 用于链接中有中文字符导致的问题 url转码 - 在线编码转换 json格式化工具 在线json格式化工具...

  • 编码相关的笔记

    《区分: 编码方式 字符集 Unicode UTF-8》有一个疑问:用多种转换工具(比如站长工具)试了,“汉”的u...

  • Base64编码

    Base64编码可将任意二进制数据转换为字符编码,转换后的编码包括:A ~ Z a ~ z 0 ~ 9 + /及作...

网友评论

      本文标题:文件批量字符编码转换工具

      本文链接:https://www.haomeiwen.com/subject/dufqnxtx.html