java GBK UTF-8编码与自动识别与统一(乱码问题)

 今天用印象笔记导我的一些笔记(txt的,我的系统是windows),发现标题都是txt的第一行,而且还有的是乱码。据说只有MAC下的印象笔记才有以txt文件名为标题的功能,我的心情就像我家门前的那条小河一样很难过……我决定对文本处理一下。

    之所以遇到乱码问题,是因为有的txt是gbk的,有的是UTF-8的(我随手记的东西,有的是用安卓dropbox写的,有的是windows notepad写的,还有linux 下用gedit写的,所以都用的默认编码),可以说这堆破玩儿意堆得很我们那破寝室外面垃圾桶里的垃圾一样杂乱无章。所以必须能识别文本是什么编码才行。

    UTF-8中文是3字节的,GBK中文是2字节的(在UE下的hex模式就能看出,按ctrl+h),有的UTF-8会用EF BB BF 来标明这个是UTF-8的文件,我考虑实用,用如下语句测试:

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

    这个是测试这段字符串的字符集,如果真是GB2312就返回true,否则就是false。不信你试试,反正我是信了……

    开始我就真的傻乎的用这句测试第一行,后来才意识到,如果第一行没英文呢?没办法,只好一行一行的读文本,并进行与运算,才下结论:这个文本是GBK还是UTF-8

    这就完了 ?没这么简单……否则我也不会无聊得继续往下写了。前面说过有的UTF-8会用EF BB BF 来标明,这也就是为啥谷歌度娘里经常会看到有人问咋读出乱码问号了呢?因为GBK是2字节的,所以它读UTF-8的乱码通常是一些莫名其妙的文字,而UTF-8是3字节读的,所以读GBK会出现一大堆问号的现象。当然英文是免遭罹难的。UTF-8编码正确,却前面多个问号正是EF BB BF搞的鬼。

    于是必须想办法去掉这个"多余"的家伙,我自己随手写了这么段代码

    

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

    没错,这三个数就是EF BB BF,还是我拿计算器算的!去年的课我是白学了……(开个玩笑,我是懒得拿草纸算)

    这么弄就基本把问题解决了,接下来就看你转的文本是想要UTF-8的还是GBK的了。我是建议GBK,用起来方便,而且你的流没明确字符集时用的就是你系统默认的字符集,咱大陆肯定是GBK了。

    然后就是遍历文件了,我把上面的东西整吧整吧,弄成一个方法,然后又用了下以前写的遍历文件夹的方法:

01 public static void fileList(File file) {
02         File[] files = file.listFiles();
03         if (files.length!=0) {
04               for (File f : files) {
05                     if (f.isFile()) {
06                         String string=f.getName();
07                         string=string.substring(string.lastIndexOf("."));
08             if (string.equals(".txt")) {//我只改txt的
09                 System.out.println(f.getPath());
10             }
11                     }
12                     else 
13                     fileList(f);
14               }
15         }
16    }


    好了,直接都转码回来了

    话说我初衷是印象笔记啊,可不是研究转码呢!这就不难了,直接把去掉后缀的文件名写在文件的第一行,用印象笔记导入文件夹就搞定啦!什么?第一行那个标题很碍眼?想导完再抹下去?这个……这个……我就不能解决了。因为印象笔记的记录都不是纯文本,我没办法用流来批量改它。当然这是我的一个笨办法,不要喷我,我还是本科生,用《围城》陆子潇的话就是“还小哩,还是小弟弟哩”……

    希望大神能解决一下印象笔记导txt这个烦人的问题,话说印象笔记全世界这么多人用,为啥不提供个这功能呢?我google一堆老外都在问这个问题呢……


你可能感兴趣的:(java GBK UTF-8编码与自动识别与统一(乱码问题))