java 统一编码_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一堆老外都在問這個問題呢……
總結
以上是生活随笔為你收集整理的java 统一编码_java GBK UTF-8编码与自动识别与统一(乱码问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java接口有非抽象方法_[Java教程
- 下一篇: java和ffmpeg使用内存转码_FF