文件批量字符編碼轉換工具

今天接到一個新項目,是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)在不會寫腳本哈哈哈哈哈哈蛆挫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妙黍,隨后出現(xiàn)的幾起案子悴侵,更是在濱河造成了極大的恐慌,老刑警劉巖拭嫁,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可免,死亡現(xiàn)場離奇詭異,居然都是意外死亡做粤,警方通過查閱死者的電腦和手機浇借,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怕品,“玉大人妇垢,你說我怎么就攤上這事。” “怎么了闯估?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵灼舍,是天一觀的道長。 經常有香客問我涨薪,道長骑素,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任尤辱,我火速辦了婚禮砂豌,結果婚禮上厢岂,老公的妹妹穿的比我還像新娘光督。我一直安慰自己,他們只是感情好塔粒,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布结借。 她就那樣靜靜地躺著,像睡著了一般卒茬。 火紅的嫁衣襯著肌膚如雪船老。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天圃酵,我揣著相機與錄音柳畔,去河邊找鬼。 笑死郭赐,一個胖子當著我的面吹牛薪韩,可吹牛的內容都是我干的。 我是一名探鬼主播捌锭,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼俘陷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了观谦?” 一聲冷哼從身側響起拉盾,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豁状,沒想到半個月后捉偏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡泻红,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年夭禽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片承桥。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡驻粟,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蜀撑,我是刑警寧澤挤巡,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站酷麦,受9級特大地震影響矿卑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜沃饶,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一母廷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糊肤,春花似錦琴昆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至升酣,卻和暖如春舷暮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噩茄。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工下面, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绩聘。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓沥割,卻偏偏與公主長得像,于是被迫代替她去往敵國和親君纫。 傳聞我的和親對象是個殘疾皇子驯遇,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351