Java字符转码
Java字符轉碼
1.關于文件轉碼
這里我對字符串進行了二進制解碼和編碼。
首先你要知道以下幾點。
1.生活中的文字轉成二進制格式的序列或其他格式的序列,叫做編碼過程。而對二進制序列或其他格式序列解析成生活中的文字,叫做解碼過程。
2.Java的string內部是用Unicode編碼的字節數組存儲字符串的,如果你Java源文件編碼方式是GBK,那么JVM會以GBK讀取源文件中“”雙引號的字符串,將讀取的GBK編碼字節解析成字符,然后再對字符以Unicode編碼成字節數組,并存儲于內部。
3.無論你源文件以那種方式編寫字符串,JVM最終都會對“雙引號”字符進行轉碼成Unicode格式并存用string對象內部。
4.string.getBytes()方法是根據你平臺或源文件默認的編碼方式進行encoding(編碼),放回的是編碼后的字節數組。string.getBytes(String charsetName)能指定編碼方式,不用擔心內部Unicode編碼->charsetName編碼,Java會幫你處理這個過程。
5.new String(byte[] b,String charsetName)這個構造函數將對指定的byte[] b指定編碼解析。
下面我舉幾個例子:
String src ="你好朋友"; //string的內部編碼方式是Unicodebyte[] U = src.getBytes(); //我的project的文件使用的是 UTF-8 encoding,所以這里返回 UTF-8編碼的字節數組 byte[] G = src.getBytes("GBK"); System.out.println(src.length()); System.out.println(U.length); System.out.println(G.length); System.out.println(Charset.defaultCharset()); //打印編譯器默認編碼格式String str1 = new String(src.getBytes("utf-8"),"utf-8"); String str2 = new String(src.getBytes("utf-8"),"gb18030"); String str3 = new String(src.getBytes("utf-8"),"GBK"); String str4 = new String(src.getBytes("utf-8"),"latin1"); System.out.println(String.format("%s\n%s\n%s\n%s\n", str1,str2,str3,str4));String str5 = new String(src.getBytes("GBK"),"utf-8"); String str6 = new String(src.getBytes("GBK"),"gb18030"); String str7 = new String(src.getBytes("GBK"),"GBK"); String str8 = new String(src.getBytes("GBK"),"latin1"); System.out.println(String.format("%s\n%s\n%s\n%s\n", str5,str6,str7,str8));運行結果如下:
4 //字符串長度 12 //平臺默認編碼為UTF-8,中文一個字占3字節,所以是12 8 //指定放回的GBK編碼,一個中文2字節,所以是8 UTF-8 //默認編碼(編譯器或源文件編碼方式) 你好朋友 //編碼和解析方式一樣,能成功解析 浣犲ソ鏈嬪弸 //utf-8編碼的字節數組,指定解析方式為gb18030,不能能成功解析 浣犲ソ鏈嬪弸 //同理 ????¥??????? //latin1壓根不支持中文������� //同理 你好朋友 //原因是GBK是gb18030的子集,GBK只包含漢字,gb18030包含小數民族的字 你好朋友 //編碼和解析方式一樣,能成功解析 ??o??óó? //latin1壓根不支持中文結果分析:
1.new String(src.getBytes(“GBK”),“utf-8”);壓根不是進行轉碼,這個是編碼和解碼過程。編碼和解析方式不同,根本無法正常顯示,這里解碼有誤過程,也非真正的轉碼。網上一些教程有錯誤。src.getBytes(“GBK”)只有這句內部進行了轉碼(Unicode——>GBK,返回了對應的字節數組。
文件轉碼的正確方式:
第一步:以正確的方式打開并讀取文件(我這里是UTF-8文件).
第二步:將字符串讀取出來,并使用getBytes(“GBK”)獲取對應的編碼的二進制數據。
第三步:將編碼后的二進制數據以二進制的方式寫入到文件中。(無需解析,直接存進去就可以了)
第四步:關閉輸入輸出流。
String path = "D:\\SogouQ\\access_log.20060803.decode.filter"; String path2 = "D:\\mytext.txt";BufferedReader br=null; BufferedOutputStream bo=null; try {br = new BufferedReader(new InputStreamReader(new FileInputStream(path),"utf-8"));bo =new BufferedOutputStream(new FileOutputStream(path2));String line = null;while ((line = br.readLine())!=null) {line=line+"\n";bo.write(line.getBytes("GBK"));} }catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace(); }finally {try {br.close();bo.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }2.URL編碼
URL 只能使用 ASCII來通過因特網進行發送。由于 URL 常常會包含 ASCII 集合之外的字符,URL 必須轉換為有效的 ASCII 格式。URL 編碼使用 “%” 其后跟隨兩位的十六進制數來替換非 ASCII 字符。又因為我們日常生活中往往會用好很多字符,而URL又只能用ASCII,所以這里需要URL編碼。
下面舉個例子:
String src ="你好朋友"; String text1 = URLEncoder.encode(src, "utf-8"); //將UTF-8字符變成ASCII字符 String text2 = URLEncoder.encode(src, "gb18030"); String text3 = URLEncoder.encode(src, "GBK"); String text4 = URLEncoder.encode(src, "latin1"); System.out.println(String.format("%s\n%s\n%s\n%s\n", text1,text2,text3,text4));String text5 = URLDecoder.decode(text1, "utf-8"); String text6 = URLDecoder.decode(text2, "gb18030"); String text7 = URLDecoder.decode(text3, "GBK"); String text8 = URLDecoder.decode(text4, "latin1"); System.out.println(String.format("%s\n%s\n%s\n%s\n", text5,text6,text7,text8));輸出結果:
%E4%BD%A0%E5%A5%BD%E6%9C%8B%E5%8F%8B //一個字節編碼成3個符號(% + 2個16進制數) %C4%E3%BA%C3%C5%F3%D3%D1 %C4%E3%BA%C3%C5%F3%D3%D1 %3F%3F%3F%3F //Latin不支持中文,所以都是%3F你好朋友 你好朋友 你好朋友 ???? //Latin不支持中文總結
- 上一篇: Redmi K70E关键规格曝光 搭载天
- 下一篇: 特斯拉 Model 3 网约车不堪高强度