java 统一编码_java GBK UTF-8编码与自动识别与统一(乱码问题)
今天用印象筆記導(dǎo)個(gè)人一些筆記(txt的,個(gè)人系統(tǒng)是windows),發(fā)現(xiàn)標(biāo)題都是txt的第一行,并且還有的是亂碼。聽說只有MAC下的印象筆記才有以txt文件名為標(biāo)題的功能,個(gè)人心情就像我家門前的那條小河同樣很難過……我決定對文本處理一下。
java
之因此遇到亂碼問題,是由于有的txt是gbk的,有的是UTF-8的(我隨手記的東西,有的是用安卓dropbox寫的,有的是windows notepad寫的,還有l(wèi)inux 下用gedit寫的,因此都用的默認(rèn)編碼),能夠說這堆破玩兒意堆得很咱們那破寢室外面垃圾桶里的垃圾同樣雜亂無章。因此必須能識別文本是什么編碼才行。
linux
UTF-8中文是3字節(jié)的,GBK中文是2字節(jié)的(在UE下的hex模式就能看出,按ctrl+h),有的UTF-8會(huì)用EF BB BF 來標(biāo)明這個(gè)是UTF-8的文件,我考慮實(shí)用,用以下語句測試: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));
這個(gè)是測試這段字符串的字符集,若是真是GB2312就返回true,不然就是false。不信你試試,反正我是信了……測試
開始我就真的傻乎的用這句測試第一行,后來才意識到,若是第一行沒英文呢?沒辦法,只好一行一行的讀文本,并進(jìn)行與運(yùn)算,才下結(jié)論:這個(gè)文本是GBK仍是UTF-8google
這就完了 ?沒這么簡單……不然我也不會(huì)無聊得繼續(xù)往下寫了。前面說過有的UTF-8會(huì)用EF BB BF 來標(biāo)明,這也就是為啥谷歌度娘里常常會(huì)看到有人問咋讀出亂碼問號了呢?由于GBK是2字節(jié)的,因此它讀UTF-8的亂碼一般是一些莫名其妙的文字,而UTF-8是3字節(jié)讀的,因此讀GBK會(huì)出現(xiàn)一大堆問號的現(xiàn)象。固然英文是免遭罹難的。UTF-8編碼正確,卻前面多個(gè)問號正是EF BB BF搞的鬼。編碼
因而必須想辦法去掉這個(gè)"多余"的家伙,我本身隨手寫了這么段代碼spa
byte[]?bt=line.getBytes("UTF8");
if?((int)bt[0]==-17&&(int)bt[1]==-69&&(int)bt[2]==-65)?{
line=line.substring(1);
}
沒錯(cuò),這三個(gè)數(shù)就是EF BB BF,仍是我拿計(jì)算器算的!去年的課我是白學(xué)了……(開個(gè)玩笑,我是懶得拿草紙算)code
這么弄就基本把問題解決了,接下來就看你轉(zhuǎn)的文本是想要UTF-8的仍是GBK的了。我是建議GBK,用起來方便,并且你的流沒明確字符集時(shí)用的就是你系統(tǒng)默認(rèn)的字符集,咱大陸確定是GBK了。字符串
而后就是遍歷文件了,我把上面的東西整吧整吧,弄成一個(gè)方法,而后又用了下之前寫的遍歷文件夾的方法: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);
}
}
}
好了,直接都轉(zhuǎn)碼回來了
話說我初衷是印象筆記啊,可不是研究轉(zhuǎn)碼呢!這就不難了,直接把去掉后綴的文件名寫在文件的第一行,用印象筆記導(dǎo)入文件夾就搞定啦!什么?第一行那個(gè)標(biāo)題很礙眼?想導(dǎo)完再抹下去?這個(gè)……這個(gè)……我就不能解決了。由于印象筆記的記錄都不是純文本,我沒辦法用流來批量改它。固然這是個(gè)人一個(gè)笨辦法,不要噴我,我仍是本科生,用《圍城》陸子瀟的話就是“還小哩,仍是小弟弟哩”……
但愿大神能解決一下印象筆記導(dǎo)txt這個(gè)煩人的問題,話說印象筆記全世界這么多人用,為啥不提供個(gè)這功能呢?我google一堆老外都在問這個(gè)問題呢……
總結(jié)
以上是生活随笔為你收集整理的java 统一编码_java GBK UTF-8编码与自动识别与统一(乱码问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java接口有非抽象方法_[Java教程
- 下一篇: java实现二分法递归_Java递归实现