今天用印象笔记导个人一些笔记(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一堆老外都在问这个问题呢……