java GBK UTF-8編碼與自動識別與統一(亂碼問題)

    今天用印象筆記導個人一些筆記(txt的,個人系統是windows),發現標題都是txt的第一行,並且還有的是亂碼。聽說只有MAC下的印象筆記纔有以txt文件名爲標題的功能,個人心情就像我家門前的那條小河同樣很難過……我決定對文本處理一下。
java

    之因此遇到亂碼問題,是由於有的txt是gbk的,有的是UTF-8的(我隨手記的東西,有的是用安卓dropbox寫的,有的是windows notepad寫的,還有linux 下用gedit寫的,因此都用的默認編碼),能夠說這堆破玩兒意堆得很咱們那破寢室外面垃圾桶裏的垃圾同樣雜亂無章。因此必須能識別文本是什麼編碼才行。
linux

    UTF-8中文是3字節的,GBK中文是2字節的(在UE下的hex模式就能看出,按ctrl+h),有的UTF-8會用EF BB BF 來標明這個是UTF-8的文件,我考慮實用,用以下語句測試:windows

FileInputStream fileInputStream= new FileInputStream(file);
              InputStreamReader inputStreamReader= new InputStreamReader(fileInputStream,"GB2312" );
        BufferedReader bufferedReader= new BufferedReader(inputStreamReader);
String line =bufferedReader.readLine();
System. out.println(java.nio.charset.Charset. forName( "GB2312").newEncoder().canEncode(line));

    這個是測試這段字符串的字符集,若是真是GB2312就返回true,不然就是false。不信你試試,反正我是信了……測試

    開始我就真的傻乎的用這句測試第一行,後來才意識到,若是第一行沒英文呢?沒辦法,只好一行一行的讀文本,並進行與運算,才下結論:這個文本是GBK仍是UTF-8google

    這就完了 ?沒這麼簡單……不然我也不會無聊得繼續往下寫了。前面說過有的UTF-8會用EF BB BF 來標明,這也就是爲啥谷歌度娘裏常常會看到有人問咋讀出亂碼問號了呢?由於GBK是2字節的,因此它讀UTF-8的亂碼一般是一些莫名其妙的文字,而UTF-8是3字節讀的,因此讀GBK會出現一大堆問號的現象。固然英文是免遭罹難的。UTF-8編碼正確,卻前面多個問號正是EF BB BF搞的鬼。編碼

    因而必須想辦法去掉這個"多餘"的傢伙,我本身隨手寫了這麼段代碼
spa

    

byte[] bt=line.getBytes("UTF8");
if ((int)bt[0]==-17&&(int)bt[1]==-69&&(int)bt[2]==-65) {
line=line.substring(1);
}

    沒錯,這三個數就是EF BB BF,仍是我拿計算器算的!去年的課我是白學了……(開個玩笑,我是懶得拿草紙算)code

    這麼弄就基本把問題解決了,接下來就看你轉的文本是想要UTF-8的仍是GBK的了。我是建議GBK,用起來方便,並且你的流沒明確字符集時用的就是你係統默認的字符集,咱大陸確定是GBK了。
字符串

    而後就是遍歷文件了,我把上面的東西整吧整吧,弄成一個方法,而後又用了下之前寫的遍歷文件夾的方法:get

public static void fileList(File file) {
        File[] files = file.listFiles();
        if (files.length!=0) {
              for (File f : files) {
                    if (f.isFile()) {
                    	String string=f.getName();
                    	string=string.substring(string.lastIndexOf("."));
			if (string.equals(".txt")) {//我只改txt的
		        System.out.println(f.getPath());
			}
                    }
                    else 
                    fileList(f);
              }
        }
   }


    好了,直接都轉碼回來了

    話說我初衷是印象筆記啊,可不是研究轉碼呢!這就不難了,直接把去掉後綴的文件名寫在文件的第一行,用印象筆記導入文件夾就搞定啦!什麼?第一行那個標題很礙眼?想導完再抹下去?這個……這個……我就不能解決了。由於印象筆記的記錄都不是純文本,我沒辦法用流來批量改它。固然這是個人一個笨辦法,不要噴我,我仍是本科生,用《圍城》陸子瀟的話就是「還小哩,仍是小弟弟哩」……

    但願大神能解決一下印象筆記導txt這個煩人的問題,話說印象筆記全世界這麼多人用,爲啥不提供個這功能呢?我google一堆老外都在問這個問題呢……

相關文章
相關標籤/搜索