解碼-->編碼--->文件(utf-8)  注:如有問題請(qǐng)留言  下面具體的實(shí)例 &nb..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java字符轉(zhuǎn)碼的三種方法總結(jié)及實(shí)例

發(fā)布時(shí)間:2020-09-22 20:57:04 來源:腳本之家 閱讀:268 作者:lqh 欄目:編程語言

java字符轉(zhuǎn)碼:三種方法

轉(zhuǎn)碼成功的前提:解碼后無亂碼

轉(zhuǎn)碼流程:文件(gbk)-->解碼-->編碼--->文件(utf-8) 

注:如有問題請(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;//寫入 
  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");//開始編碼 
    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 
   *       讀取過程中發(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-->寫入文件 
 * </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;// 文件通道:雙向,流從中而過 
  private FileChannel out;// 文件通道:雙向,流從中而過 
  private FileOutputStream fos;// 文件輸出流:向文件中寫入內(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);// 開始編碼 
 
      temp.clear();// 清除標(biāo)記 
      temp = en.encode(convertion); 
      b.flip(); // 將標(biāo)記移到緩沖區(qū)的開始,并保存其中所有的數(shù)據(jù):將標(biāo)記移到開始0 
      out.write(temp); // 將緩沖區(qū)內(nèi)的內(nèi)容寫入文件中:從標(biāo)記處開始取出數(shù)據(jù) 
    } 
  } 
 
  /** 
   * <pre> 
   * 測(cè)試轉(zhuǎn)碼是否成功, 指定字符集讀取文件 
   * </pre> 
   * 
   * @param src 
   *      被復(fù)制文件全路徑 
   * @param charset 解碼字符集 
   * 
   * @throws IOException 讀取過程中的發(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ì)本站的支持!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI