java字符轉(zhuǎn)碼的三種方法總結(jié)及實(shí)例
java字符轉(zhuǎn)碼:三種方法
轉(zhuǎn)碼成功的前提:解碼后無(wú)亂碼
轉(zhuǎn)碼流程:文件(gbk)-->解碼-->編碼--->文件(utf-8)
注:如有問(wèn)題請(qǐng)留言
下面具體的實(shí)例
方法一:Java.lang.String
//用于解碼的構(gòu)造器: String(byte[] bytes, int offset, int length, String charsetName) String(byte[] bytes, String charsetName) 用于編碼的方法: byte[] getBytes(String charsetName) //使用指定字符集進(jìn)行編碼 byte[] getBytes() //使用系統(tǒng)默認(rèn)字符集進(jìn)行編碼
public void convertionString() throws UnsupportedEncodingException{ String s = "清山"; byte[] b = s.getBytes("gbk");//編碼 String sa = new String(b, "gbk");//解碼:用什么字符集編碼就用什么字符集解碼 System.out.println(sa); b = sa.getBytes("utf-8");//編碼 sa = new String(b, "utf-8");//解碼 System.err.println(sa); }
方法二:java.io.InputStreamReader/OutputStreamWriter:橋轉(zhuǎn)換
package com.qingshan.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /** * <pre> * 使用java.io橋轉(zhuǎn)換:對(duì)文件進(jìn)行轉(zhuǎn)碼 * </pre> * <hr Color="green" ></hr> * 2012 Qingshan Group 版權(quán)所有 * <hr Color="green" ></hr> * @author thetopofqingshan * @version 1.0.0 * @since JDK 1.5 * @date 2012-4-28 */ public class CharsetConvertion { private FileInputStream fis;// 文件輸入流:讀取文件中內(nèi)容 private InputStream is; private InputStreamReader isr; private OutputStream os; private OutputStreamWriter osw;//寫(xiě)入 private char[] ch = new char[1024]; public void convertionFile() throws IOException{ is = new FileInputStream("C:/項(xiàng)目進(jìn)度跟蹤.txt");//文件讀取 isr = new InputStreamReader(is, "gbk");//解碼 os = new FileOutputStream("C:/項(xiàng)目進(jìn)度跟蹤_utf-8.txt");//文件輸出 osw = new OutputStreamWriter(os, "utf-8");//開(kāi)始編碼 char[] c = new char[1024];//緩沖 int length = 0; while(true){ length = isr.read(c); if(length == -1){ break; } System.out.println(new String(c, 0, length)); osw.write(c, 0, length); osw.flush(); } } public void convertionString() throws UnsupportedEncodingException{ String s = "清山集團(tuán)"; byte[] b = s.getBytes("gbk");//編碼 String sa = new String(b, "gbk");//解碼:用什么字符集編碼就用什么字符集解碼 System.out.println(sa); b = sa.getBytes("utf-8");//編碼 sa = new String(b, "utf-8");//解碼 System.err.println(sa); } /** * <pre> * 關(guān)閉所有流 * </pre> * */ public void close(){ if(isr != null){ try { isr.close(); } catch (IOException e) { e.printStackTrace(); } } if(is != null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(osw != null){ try { osw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(os != null){ try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * <pre> * 用io讀取文件內(nèi)容 * </pre> * * @throws IOException * 讀取過(guò)程中發(fā)生錯(cuò)誤 * */ /** * <pre> * * </pre> * @param path * @param charset * @throws IOException * */ public void read(String path, String charset) throws IOException { fis = new FileInputStream(path); isr = new InputStreamReader(fis, charset); while (fis.available() > 0) { int length = isr.read(ch); System.out.println(new String(ch)); } } public static void main(String[] args) { try { CharsetConvertion cc = new CharsetConvertion(); cc.convertionFile(); cc.convertionString(); cc.close(); } catch (IOException e) { e.printStackTrace(); } } }
方法三:java.nio.Charset
package com.qingshan.nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; /** * <pre> * 使用nio中的Charset轉(zhuǎn)換字符:整個(gè)流程是文件讀取-->byte-->解碼(正確)-->編碼--->byte-->寫(xiě)入文件 * </pre> * <hr Color="green" > * </hr> * 2012 Qingshan Group 版權(quán)所有 * <hr Color="green" > * </hr> * * @author thetopofqingshan * @version 1.0.0 * @since JDK 1.5 * @date 2012-4-27 */ public class CharsetConvertion { private FileInputStream fis;// 文件輸入流:讀取文件中內(nèi)容 private FileChannel in;// 文件通道:雙向,流從中而過(guò) private FileChannel out;// 文件通道:雙向,流從中而過(guò) private FileOutputStream fos;// 文件輸出流:向文件中寫(xiě)入內(nèi)容 private ByteBuffer b = ByteBuffer.allocate(1024 * 3);// 設(shè)置緩存區(qū)的大小 private Charset inSet;// 解碼字符集 private Charset outSet;// 編碼字符集 private CharsetDecoder de;// 解碼器 private CharsetEncoder en;// 編碼器 private CharBuffer convertion;// 中間的字符數(shù)據(jù) private ByteBuffer temp = ByteBuffer.allocate(1024 * 3);// 設(shè)置緩存區(qū)的大小:臨時(shí) private byte[] by = new byte[1024]; private InputStreamReader isr; private char[] ch = new char[1024]; /** * <pre> * * </pre> * * @param src * @param dest * @throws IOException * */ public void convertionFile_nio(String src, String dest) throws IOException { fis = new FileInputStream(src); in = fis.getChannel(); fos = new FileOutputStream(dest); out = fos.getChannel(); inSet = Charset.forName("gbk"); outSet = Charset.forName("utf-8"); de = inSet.newDecoder(); en = outSet.newEncoder(); while (fis.available() > 0) { b.clear();// 清除標(biāo)記 in.read(b); // 將文件內(nèi)容讀入到緩沖區(qū)內(nèi):將標(biāo)記位置從0-b.capacity(), // 讀取完畢標(biāo)記在0-b.capacity()之間 b.flip();// 調(diào)節(jié)標(biāo)記,下次讀取從該位置讀起 convertion = de.decode(b);// 開(kāi)始編碼 temp.clear();// 清除標(biāo)記 temp = en.encode(convertion); b.flip(); // 將標(biāo)記移到緩沖區(qū)的開(kāi)始,并保存其中所有的數(shù)據(jù):將標(biāo)記移到開(kāi)始0 out.write(temp); // 將緩沖區(qū)內(nèi)的內(nèi)容寫(xiě)入文件中:從標(biāo)記處開(kāi)始取出數(shù)據(jù) } } /** * <pre> * 測(cè)試轉(zhuǎn)碼是否成功, 指定字符集讀取文件 * </pre> * * @param src * 被復(fù)制文件全路徑 * @param charset 解碼字符集 * * @throws IOException 讀取過(guò)程中的發(fā)生的異常 * */ public void read(String path, String charset) throws IOException { fis = new FileInputStream(path); isr = new InputStreamReader(fis, charset); while (fis.available() > 0) { int length = isr.read(ch); System.out.println(new String(ch)); } } /** * <pre> * 關(guān)閉所有流或通道 * </pre> * */ public void close() { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fis != null) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { CharsetConvertion n = new CharsetConvertion(); try { n.convertionFile_nio("C:/項(xiàng)目進(jìn)度跟蹤.txt", "C:/nio_write.txt"); // n.read("C:/nio_write.txt", "utf-8");// 正確 // n.read("C:/nio_write.txt", "gbk");//亂碼 } catch (IOException e) { e.printStackTrace(); } finally { n.close(); } } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
SpringBoot web開(kāi)發(fā)源碼深入分析
Web開(kāi)發(fā)的核心內(nèi)容主要包括內(nèi)嵌的Servlet容器和SpringMVCSpringBoot使用起來(lái)非常簡(jiǎn)潔,大部分配置都有SpringBoot自動(dòng)裝配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10java.sql.Date和java.util.Date的區(qū)別詳解
Java中有兩個(gè)Date類(lèi),一個(gè)是java.util.Date通常情況下用它獲取當(dāng)前時(shí)間或構(gòu)造時(shí)間,另一個(gè)是java.sql.Date是針對(duì)SQL語(yǔ)句使用的,它只包含日期而沒(méi)有時(shí)間部分,這篇文章主要給大家介紹了關(guān)于java.sql.Date和java.util.Date區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-03-03SpringBoot?@Configuration與@Bean注解使用介紹
這篇文章主要介紹了SpringBoot中的@Configuration與@Bean注解,在進(jìn)行項(xiàng)目編寫(xiě)前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2022-10-10MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解
今天小編就為大家分享一篇關(guān)于MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03解決response.setHeader設(shè)置下載文件名無(wú)效的問(wèn)題
這篇文章主要介紹了解決response.setHeader設(shè)置下載文件名無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Spring?Boot日志SLF4J和Logback示例詳解
這篇文章主要介紹了Spring?Boot日志SLF4J和Logback詳解,Logback相比于Log4j,性能提高了10倍以上的性能,占用的內(nèi)存也變小了,并且文檔十分詳細(xì),推薦使用Slf4j+Logback,需要的朋友可以參考下2023-07-07