程式扎記: [ Java代碼範本 ] 如何讀取特定編碼格式文件的內容 與 如何讀取特定編碼的內碼

標籤

2010年9月17日 星期五

[ Java代碼範本 ] 如何讀取特定編碼格式文件的內容 與 如何讀取特定編碼的內碼

前言 : 

這裡我們會討論到兩個主題, 一是如何讀取特定編碼文件的內容. 如果你的預設編碼是Big5, 但你用BufferedReader 一行行去讀取UTF-8編碼文件的內容, 你應該會發現除了英文與數字外, 其他如中文都變成了亂碼, 你便可以參考主題一來解決這個問題. 主題二則是告訴你如何簡單使用Java代碼來讀取某個字元的特定編碼的內碼.


* 如何讀取特定編碼格式文件的內容 
假設你的預設編碼是UTF-8 (通常預設編碼就是你的IDE的預設編碼), 但你需要讀的檔案卻是Big5編碼. 這時你便需要將文件以byte的形式讀出在做對應的轉碼. 若你是直接使用BufferedReader.readLine() 方法, 這樣程序便會以預設編碼 (UTF-8) 來讀取文件內容, 相當然爾讀出的中文字都會變成亂碼. 詳細的代碼請參考如下 :

範例代碼 : 
  1. package gays.encode;  
  2.   
  3. import java.io.*;  
  4.   
  5. public class ReadLine {  
  6.       
  7.     /** 
  8.      * 簡介 : 以預設編碼進行讀取檔案內容. 
  9.      * @param f 
  10.      */  
  11.     public static void readFile(File f){  
  12.         System.out.println("\t***Using" +System.getProperty("file.encoding")+"***");  
  13.         try{  
  14.             FileReader fr = new FileReader(f);  
  15.             BufferedReader br = new BufferedReader(fr);  
  16.             String line;  
  17.             while((line=br.readLine())!=null){  
  18.                 System.out.println(line);  
  19.             }  
  20.             br.close();  
  21.             fr.close();  
  22.         }catch( FileNotFoundException e){  
  23.             e.printStackTrace();  
  24.         }catch( IOException ioe){  
  25.             ioe.printStackTrace();  
  26.         }  
  27.     }  
  28.       
  29.     /** 
  30.      * 簡介 : 將傳入文件以指定編碼讀入並列印出來. 
  31.      * @param f 
  32.      */  
  33.     public static void readFileEncode(File f,String encode){          
  34.         System.out.println("\t***Using "+encode+" encoding***");  
  35.         try{              
  36.             FileInputStream fis = new FileInputStream(f);  
  37.             byte[] lineb = new byte[500];  
  38.             int rc = 0;  
  39.             StringBuffer sb= new StringBuffer("");  
  40.             while((rc = fis.read(lineb))> 0){  
  41.                 String utf8 = new String(lineb,encode);               
  42.                 sb.append(utf8+"\n");  
  43.             }  
  44.             fis.close();  
  45.             System.out.println(sb.toString().trim());             
  46.         }catch(FileNotFoundException e){  
  47.             e.printStackTrace();  
  48.         }catch(IOException ioe){  
  49.             ioe.printStackTrace();  
  50.         }  
  51.           
  52.     }  
  53.       
  54.     public static void main(String args[]){  
  55.         File f = new File("G:/aaa/utf_8.txt"); //Read file with UTF-8 encoding.  
  56.         File f2 = new File("G:/aaa/big5.txt");  
  57.         /*Read file in normal way*/  
  58.         System.out.println("\t***Read file with utf-8 encoding***");          
  59.         readFile(f);  
  60.         System.out.println("\t***Read file with ASCII encoding***");  
  61.         readFile(f2);  
  62.         System.out.println("===============================================");  
  63.         /*Read file with UTF-8 encoding*/  
  64.         System.out.println("\t***Read file with utf-8 encoding***");  
  65.         readFileEncode(f,"utf-8");  
  66.         System.out.println("\t***Read file with ASCII encoding***");  
  67.         readFileEncode(f2,"big5");  
  68.     }  
  69.   
  70. }  
執行結果 : 
***Read file with utf-8 encoding***
***UsingUTF-8***
這是UTF8編碼$%^&*()
***Read file with ASCII encoding***
***UsingUTF-8***
�o�OBig5�s�X!@#$%^&*() <使用utf-8編碼去讀big5編碼的文件, 中文會亂碼>
===============================================
***Read file with utf-8 encoding***
***Using utf-8 encoding***
這是UTF8編碼$%^&*()
***Read file with ASCII encoding***
***Using big5 encoding***
這是Big5編碼!@#$%^&*()


* 如何讀取特定編碼的內碼 
你可以藉由String物件的API:getBytes(String charset) 來取出特定編碼的byte. 詳細代碼請參考如下 :

範例代碼 : 
  1. package gays.encode;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4.   
  5. public class ReadEncodeInHex {  
  6.       
  7.     /** 
  8.      * Source : http://www.javaworld.com.tw/jute/post/view?bid=29&id=263997&sty=1&tpg=1&age=0 
  9.      *          http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E5%A5%8E 
  10.      * 簡介 : 如何取出字元的編碼(Hex) 
  11.      * @param args 
  12.      * @throws UnsupportedEncodingException 
  13.      */  
  14.     public static void main(String[] args) throws UnsupportedEncodingException {  
  15.         System.out.println("****a****");  
  16.         ReadEncodeInHex.decode("a""UTF-8");  
  17.         ReadEncodeInHex.decode("a""UTF-16");  
  18.         ReadEncodeInHex.decode("a""BIG5");  
  19.         ReadEncodeInHex.decode("a""GB2312");  
  20.         System.out.println("\n****奎****");  
  21.         ReadEncodeInHex.decode("奎""UTF-8");  
  22.         ReadEncodeInHex.decode("奎""UTF-16");  
  23.         ReadEncodeInHex.decode("奎""BIG5");  
  24.         ReadEncodeInHex.decode("奎""GB2312");  
  25.       }  
  26.        
  27.       public static void decode(String str, String charSet)  
  28.           throws UnsupportedEncodingException {  
  29.         byte[] array = str.getBytes(charSet);  
  30.         System.out.println("CharSet: " + charSet);  
  31.         System.out.println("length: " + array.length);  
  32.         System.out.println("values: ");  
  33.         for (byte c : array) {  
  34.           System.out.print(Integer.toHexString(c & 0xFF)+" ");  
  35.         }  
  36.         System.out.println();  
  37.       }  
  38. }  
執行結果 : 
****a****
CharSet: UTF-8
length: 1
values:
61
CharSet: UTF-16
length: 4
values:
fe ff 0 61
CharSet: BIG5
length: 1
values:
61
CharSet: GB2312
length: 1
values:
61

****奎****
CharSet: UTF-8
length: 3
values:
e5 a5 8e
CharSet: UTF-16
length: 4
values:
fe ff 59 4e
CharSet: BIG5
length: 2
values:
ab b6
CharSet: GB2312
length: 2
values:
bf fc

補充說明 : 
@. 你可以參考如下URL得知某個 Char 的各個編碼的內碼 
http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E5%A5%8E 
@. UTF-8 Wiki 
@. Unicode Wiki

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!