程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java字符集編碼與轉碼

Java字符集編碼與轉碼

編輯:關於JAVA

Java編譯時候,會將java文件的編碼按照指定編碼或者(系統默認的)編碼轉換為Unicode並加載到內存中進行編譯。

下面給出一個Java轉碼工具,沒有測試過,呵呵:

package lavasoft.common;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.*;
/**
* 轉碼工具,全面支持文件、字符串的轉碼
*
* @author Administrator 2009-11-29 16:14:21
*/
public class EncodingToolkit {
         private static Log log = LogFactory.getLog(EncodingToolkit.class);
         public static void main(String[] args) {
                 String han = "漢";

                 System.out.println("---------");
         }
         /**
          * 對字符串重新編碼
          *
          * @param text     字符串
          * @param resEncoding 源編碼
          * @param newEncoding 新編碼
          * @return 重新編碼後的字符串
          */
         public static String reEncoding(String text, String resEncoding, String newEncoding) {
                 String rs = null;
                 try {
                         rs = new String(text.getBytes(resEncoding), newEncoding);
                 } catch (UnsupportedEncodingException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是使用了不支持的字符編碼");
                         throw new RuntimeException(e);
                 }
                 return rs;
         }
         /**
          * 重新編碼Unicode字符串
          *
          * @param text     源字符串
          * @param newEncoding 新的編碼
          * @return 指定編碼的字符串---www.bianceng.cn
          */
         public static String reEncoding(String text, String newEncoding) {
                 String rs = null;
                 try {
                         rs = new String(text.getBytes(), newEncoding);
                 } catch (UnsupportedEncodingException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是使用了不支持的字符編碼" + newEncoding);
                         throw new RuntimeException(e);
                 }
                 return rs;
         }
         /**
          * 文本文件重新編碼
          *
          * @param resFile   源文件
          * @param resEncoding 源文件編碼
          * @param distFile   目標文件
          * @param newEncoding 目標文件編碼
          * @return 轉碼成功時候返回ture,否則false
          */
         public static boolean reEncoding(File resFile, String resEncoding, File distFile, String newEncoding) {
                 boolean flag = true;
                 InputStreamReader reader = null;
                 OutputStreamWriter writer = null;
                 try {
                         reader = new InputStreamReader(new FileInputStream(resFile), resEncoding);
                         writer = new OutputStreamWriter(new FileOutputStream(distFile), newEncoding);
                         char buf[] = new char[1024 * 64];  //字符緩沖區
                         int len;
                         while ((len = reader.read(buf)) != -1) {
                                 writer.write(buf, 0, len);
                         }
                         writer.flush();
                         writer.close();
                         reader.close();
                 } catch (FileNotFoundException e) {
                         flag = false;
                         log.error("沒有找到文件,轉碼發生異常!");
                         throw new RuntimeException(e);
                 } catch (IOException e) {
                         flag = false;
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是讀取文件異常!");
                         throw new RuntimeException(e);
                 } finally {
                         if (reader != null) try {
                                 reader.close();
                         } catch (IOException e) {
                                 flag = false;
                                 throw new RuntimeException(e);
                         } finally {
                                 if (writer != null) try {
                                         writer.close();
                                 } catch (IOException e) {
                                         flag = false;
                                         throw new RuntimeException(e);
                                 }
                         }
                 }
                 return flag;
         }
         /**
          * 讀取文件為一個Unicode編碼的內存字符串,保持文件原有的換行格式
          *
          * @param resFile    源文件對象
          * @param encoding 文件字符集編碼
          * @return 文件內容的Unicode字符串
          */
         public static String file2String(File resFile, String encoding) {
                 StringBuffer sb = new StringBuffer();
                 try {
                         LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(new FileInputStream(resFile), encoding)));
                         String line;
                         while ((line = reader.readLine()) != null) {
                                 sb.append(line).append(System.getProperty("line.separator"));
                         }
                         reader.close();
                 } catch (UnsupportedEncodingException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是使用了不支持的字符編碼" + encoding);
                         throw new RuntimeException(e);
                 } catch (FileNotFoundException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因所給的文件" + resFile + "不存在!");
                         throw new RuntimeException(e);
                 } catch (IOException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是讀取文件異常!");
                         throw new RuntimeException(e);
                 }
                 return sb.toString();
         }
         /**
          * 使用指定編碼讀取輸入流為一個內存Unicode字符串,保持文件原有的換行格式
          *
          * @param in             輸入流
          * @param encoding 構建字符流時候使用的字符編碼
          * @return Unicode字符串
          */
         public static String stream2String(InputStream in, String encoding) {
                 StringBuffer sb = new StringBuffer();
                 LineNumberReader reader = null;
                 try {
                         reader = new LineNumberReader(new BufferedReader(new InputStreamReader(in, encoding)));
                         String line;
                         while ((line = reader.readLine()) != null) {
                                 sb.append(line).append(System.getProperty("line.separator"));
                         }
                         reader.close();
                         in.close();
                 } catch (UnsupportedEncodingException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是使用了不支持的字符編碼" + encoding);
                         throw new RuntimeException(e);
                 } catch (IOException e) {
                         log.error("讀取文件為一個內存字符串失敗,失敗原因是讀取文件異常!");
                         throw new RuntimeException(e);
                 } finally {
                         if (in != null) try {
                                 in.close();
                         } catch (IOException e) {
                                 log.error("關閉輸入流發生異常!", e);
                                 throw new RuntimeException(e);
                         }
                 }
                 return sb.toString();
         }
         /**
          * 字符串保存為制定編碼的文本文件
          *
          * @param text         字符串
          * @param distFile 目標文件
          * @param encoding 目標文件的編碼
          * @return 轉換成功時候返回ture,否則false
          */
         public static boolean string2TextFile(String text, File distFile, String encoding) {
                 boolean flag = true;
                 if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs();
                 OutputStreamWriter writer = null;
                 try {
                         writer = new OutputStreamWriter(new FileOutputStream(distFile), encoding);
                         writer.write(text);
                         writer.close();
                 } catch (IOException e) {
                         flag = false;
                         log.error("將字符串寫入文件發生異常!");
                         throw new RuntimeException(e);
                 } finally {
                         if (writer != null) try {
                                 writer.close();
                         } catch (IOException e) {
                                 log.error("關閉輸出流發生異常!", e);
                                 throw new RuntimeException(e);
                         }
                 }
                 return flag;
         }
}

出處:http://lavasoft.blog.51cto.com/62575/236392

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved