bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Java JAVA 編碼測試大全
查看: 2785|回復: 0
go

JAVA 編碼測試大全 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2011-1-14 10:12 |只看該作者 |倒序瀏覽 |打印
參考來源 http://java.fromtw.com/java/java_char_encode.html

壹、行前教育
  這裡不多說廢話,程式編碼的部分首重 INPUT 與 OUTPUT

  INPUT 的部分包括: 檔案的讀取、資料庫的讀取、網路的讀取與 CONSOLE 的讀取等各類 INPUT 的途徑
  OUTPUT 的部分包括: 檔案的寫入、資料庫的寫入、網路的輸出與 CONSOLE 的輸出等各類 OUTPUT 的途徑

  在 JAVA 的架構裡面,為了方便開發人員開發程式, 在編譯階段(compile time)與執行階段(run time),
  假如程式沒有特別指定 INPUT 與 OUTPUT 的編碼方式, java 一律以當時系統環境預設的字集做編碼
  但是這種方式倒有點造成開發人員的困擾,明明程式在開發的時候很正常,怎麼 deploy 之後跑出一堆亂碼呢?
  底下筆者做了兩種測試, 供大家參考一下,雖然沒有測試到資料庫與網路的部分, 但是資料庫與網路的概念都是一樣的(資料庫必須注意 JDBC 驅動程式)
   
貳、開始測試
一、String編碼測試
(1) 程式原始碼
  1. //testCharSet.java
  2. import java.io.*;
  3. public class testCharSet{
  4.   public static void main(String[] argv){
  5.     String encProperty = System.getProperty("file.encoding");
  6.     System.out.println("default character=" + encProperty);
  7.     String sHelloWorld ="你好";
  8.     OutputStreamWriter aOSW = null;
  9.     try{
  10.       aOSW = new OutputStreamWriter(System.out,"BIG5");
  11.       aOSW.write("output as big5 character set:"+sHelloWorld+"\n"); // 強迫以BIG5的字集輸出
  12.       aOSW.flush();
  13.       System.out.println("output as run-time character set:"+sHelloWorld); // 以當時的預設字集輸出
  14.     }catch(Exception ex){};
  15.   }
  16. }
複製代碼
記得存檔時要確認是以BIG5的字集存檔
(這個可能會讓人有點搞不清楚,簡單地說就是檔案會有一個標準的存檔字集,這個字集取決與作業系統的版本,如中文版則存檔時預設都是以BIG5 or MS950的字集存檔)

(2) 編譯程式

# javac -encoding BIG5 testCharSet.java // 以BIG5的字集強迫編譯

(3) 執行程式(一)

# export LANG=en_US                   // 設定環境的預設字集是iso8859-1,這是linux 或 unix-like的設定法,不適用於windows,
# java testCharSet                    // 且windows更改字集不像linux那麼容易改<-真是糟糕
default character=ISO-8859-1          // 系統偵測預設字集是ISO-8859-1
output as big5 character set:你好     // 還是可以正常輸出中文
output as run-time character set:??   // 輸出中文失敗

(4) 執行程式(二)

# export LANG=zh_TW.Big5              // 設定環境的預設字集是BIG5
# java testCharSet
default character=BIG5                // 系統偵測出預設字集是BIG5
output as big5 character set:你好     // 正常輸出中文
output as run-time character set:你好 // 正常輸出中文
#

(5) 說明
程式在編譯階段,要注意用哪種字集做編譯,若檔案是UTF-8的字集的存檔,則要以UTF-8的方式編譯
程式在執行階段,輸出時要注意你的預設字集是什麼,若不清楚你程式的預設編碼是什麼,則可以採用強迫編碼的方式輸出,
才不會造成以後輸出時候的困擾


二、InputStream編碼測試
    本程式將會以BIG5編碼強迫去讀取一個文字檔,然後強迫以BIG5輸出
(1) 程式原始碼
  1. // testCharSet2.java
  2. // java testCharSet   
  3. import java.io.*;
  4. public class testCharSet2{
  5.   public static void main(String[] argv){
  6.     File aFile = null;
  7.     FileInputStream aFIS= null;
  8.     try{
  9.       aFile = new File(argv[0]);
  10.       aFIS = new FileInputStream(aFile);
  11.       outString(System.out,argv[2], inString(aFIS,argv[1]));
  12.     }catch(Exception ex){
  13.     }
  14.   }

  15.   private static String inString(InputStream aIS,String sEncode){
  16.     InputStreamReader aISR = null;
  17.     BufferedReader aBR = null;
  18.     String sTemp = null;
  19.     String sReturn = null;
  20.     try{
  21.       aISR = new InputStreamReader(aIS,sEncode);
  22.       aBR = new BufferedReader(aISR);
  23.       sReturn = "";
  24.       while( (sTemp = aBR.readLine())!=null )
  25.          sReturn = sReturn + sTemp;
  26.     }catch(Exception ex){};
  27.     return sReturn;

  28.   }
  29.   private static void outString(OutputStream aOS,String sEncode,String sOutString){
  30.     OutputStreamWriter aOSW = null;
  31.     try{
  32.       aOSW = new OutputStreamWriter(aOS,sEncode);
  33.       aOSW.write(sOutString);
  34.       aOSW.flush();
  35.     }catch(Exception ex){;}
  36.   }
  37. }
複製代碼
(2) 編譯程式

# javac testCharSet2.java

因為程式並沒有任何非英文系的字元,所以編譯時不需要強迫編碼

(3) 執行程式
執行程式前先建立一個測試檔案
==== test.txt ======
你好ㄚ
====================
然後執行程式
# java testCharSet2 test.txt BIG5 BIG5
你好ㄚ
#


(4) 說明
讓我們檢視程式原始碼,在讀檔的時候,因為檔案是用BIG5存檔的,所以為了讀檔時不受當時環境的預設字集影響
所以採用強迫編碼的方式讀檔,且輸出的時候也是強迫編碼的方式輸出,這樣才不至於造成困擾


參、自行測試
  若是各位要破解java的編碼秘密,強迫編碼,這裡大概做個列表,供大家參考
一、編譯階段
  (1)存檔的時候,記得要適當的存檔,比如說含有UTF-8碼的程式,就要存成UTF-8的檔案
  (2)確定存成適當的檔案之後,編譯時候,也可以加上-encoding 的參數強迫編碼
  (3)jsp檔案除了注意存檔的字集外,也要注意 這會影響到jsp編譯成class的正確性
二、執行階段
  輸出部分
  jsp、servlet  => 請使用response.setContentType(),用來通知瀏覽器,輸出的是什麼字集
  檔案的輸出,與網路的輸出,jsp,servlet  => 請使用OutputStreamWriter這個物件,用來強迫輸出成適當的字集
  資料庫的寫入  => 要仔細查閱JDBC是否會自動幫你做轉碼,如果不會請自行編碼
  
  輸入部分
  jsp與servlet => 請使用request.setCharacterEncoding(),強迫將client端輸入的字做編碼
  檔案的輸出,與網路的輸出,jsp,servlet  => 請使用InputStreamReader這個物件,用來強迫讀取的時候同時編碼
  資料庫的輸入  => 要仔細查閱JDBC是否會自動幫你做轉碼,如果不會請自行查看是否需要額外設定

筆者任職於合世生醫科技資訊部
歡迎有問題來信討論  william.chen@hlmt.com.tw
2004/03/24
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-4-19 17:45 , Processed in 0.019781 second(s), 10 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.