程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java 編程技術中漢字問題的分析及解決

Java 編程技術中漢字問題的分析及解決

編輯:JAVA編程入門知識

       內容:
  漢字編碼的常識
  Java 中文問題的初步熟悉
  Java 中文問題的表層分析及處理
  Java 中文問題的根源分析及解決
  Java Servlet 中文問題的根源
  修改 Servlet.jar
  中文亂碼的處理函數
   
  在基於 Java 語言的編程中,我們經常碰到漢字的處理及顯示的問題。一大堆看不懂的亂碼肯定不是我們願意看到的顯示效果,怎樣才能夠讓那些漢字正確顯示呢?Java 語言默認的編碼方式是UNICODE ,而我們中國人通常使用的文件和數據庫都是基於 GB2312 或者 BIG5 等方式編碼的,怎樣才能夠恰當地選擇漢字編碼方式並正確地處理漢字的編碼呢?本文將從漢字編碼的常識入手,結合 Java 編程實例,分析以上兩個問題並提出解決它們的方案。
  
  現在 Java 編程語言已經廣泛應用於互聯網世界,早在 Sun 公司開發 Java 語言的時候,就已經考慮到對非英文字符的支持了。Sun 公司公布的 Java 運行環境(JRE)本身就分英文版和國際版,但只有國際版才支持非英文字符。不過在 Java 編程語言的應用中,對中文字符的支持並非如同 Java Soft 的標准規范中所宣稱的那樣完美,因為中文字符集不只一個,而且不同的操作系統對中文字符的支持也不盡相同,所以會有許多和漢字編碼處理有關的問題在我們進行應用開發中困擾著我們。有很多關於這些問題的解答,但都比較瑣碎,並不能夠滿足大家迫切解決問題的願望,關於 Java 中文問題的系統研究並不多,本文從漢字編碼常識出發,分析 Java 中文問題,希望對大家解決這個問題有所幫助。
  
  漢字編碼的常識
  
  我們知道,英文字符一般是以一個字節來表示的,最常用的編碼方法是 ASCII 。但一個字節最多只能區分256個字符,而漢字成千上萬,所以現在都以雙字節來表示漢字,為了能夠與英文字符分開,每個字節的最高位一定為1,這樣雙字節最多可以表示64K格字符。我們經常碰到的編碼方式有 GB2312、BIG5、UNICODE 等。關於具體編碼方式的具體資料,有愛好的讀者可以查閱相關資料。我膚淺談一下和我們關系密切的 GB2312 和 UNICODE。GB2312 碼,中華人民共和國國家標准漢字信息交換用編碼,是一個由中華人民共和國國家標准總局發布的關於簡化漢字的編碼,通行於中國大陸地區及新加坡,簡稱國標碼。兩個字節中,第一個字節(高字節)的值為區號值加32(20H),第二個字節(低字節)的值為位號值加32(20H),用這兩個值來表示一個漢字的編碼。UNICODE 碼是微軟提出的解決多國字符問題的多字節等長編碼,它對英文字符采取前面加“0”字節的策略實現等長兼容。如 “A” 的 ASCII 碼為0x41,UNICODE 就為0x00,0x41。利用非凡的工具各種編碼之間可以互相轉換。
  
  Java 中文問題的初步熟悉
  
  我們基於 Java 編程語言進行應用開發時,不可避免地要處理中文。Java 編程語言默認的編碼方式是 UNICODE,而我們通常使用的數據庫及文件都是基於 GB2312 編碼的,我們經常碰到這樣的情況:浏覽基於 jsp 技術的網站看到的是亂碼,文件打開後看到的也是亂碼,被 Java 修改過的數據庫的內容在別的場合應用時無法繼續正確地提供信息。
  
  String sEnglish = “apple”;
  
  String sChinese = “蘋果”;
  
  String s = “蘋果 apple ”;
  
  sEnglish 的長度是5,sChinese的長度是4,而 s 默認的長度是14。對於 sEnglish來說, Java 中的各個類都支持得非常好,肯定能夠正確顯示。但對於 sChinese 和 s 來說,雖然 Java Soft 聲明 Java 的基本類已經考慮到對多國字符的支持(默認 UNICODE 編碼),但是假如操作系統的默認編碼不是 UNICODE ,而是國標碼等。從 Java 源代碼到得到正確的結果,要經過 “Java 源代碼-> Java 字節碼-> ;虛擬機->操作系統->顯示設備”的過程。在上述過程中的每一步驟,我們都必須正確地處理漢字的編碼,才能夠使最終的顯示結果正確。
  
  “ Java 源代碼-> Java 字節碼”,標准的 Java 編譯器 javac 使用的字符集是系統默認的字符集,比如在中文 Windows 操作系統上就是 GBK ,而在 Linux 操作系統上就是ISO-8859-1,所以大家會發現在 Linux 操作系統上編譯的類中源文件中的中文字符都出了問題,解決的辦法就是在編譯的時候添加 encoding 參數,這樣才能夠與平台無關。用法是
  
  javac –encoding GBK。
  
  “ Java 字節碼->虛擬機->操作系統”, Java 運行環境 (JRE) 分英文版和國際版,但只有國際版才支持非英文字符。 Java 開發工具包(JDK) 肯定支持多國字符,但並非所有的計算機用戶都安裝了 JDK 。很多操作系統及應用軟件為了能夠更好的支持 Java ,都內嵌了 JRE 的國際版本,為自己支持多國字符提供了方便。
  
  “操作系統->顯示設備”,對於漢字來說,操作系統必須支持並能夠顯示它。英文操作系統假如不搭配非凡的應用軟件的話,是肯定不能夠顯示中文的。
  
  還有一個問題,就是在 Java 編程過程中,對中文字符進行正確的編碼轉換。例如,向網頁輸出中文字符串的時候,不論你是用
  
  out.println(string);       // string 是含中文的字符串
  
  還是用
  
  <%=string%>,都必須作 UNICODE 到 GBK 的轉換,或者手動,或者自動。在 JSP 1.0中,可以定義輸出字符集,從而實現內碼的自動轉換。用法是
  
  <%@page ContentType=”text/Html;charset=gb2312” %>
  
  但是在一些 JSP 版本中並沒有提供對輸出字符集的支持,(例如 JSP 0.92),這就需要手動編碼輸出了,方法非常多。最常用的方法是
  
  String s1 = request.getParameter(“keyWord”);
  
  String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);
  
  getBytes 方法用於將中文字符以“ISO-8859-1”編碼方式轉化成字節數組,而“GBK” 是目標編碼方式。我們從以ISO-8859-1方式編碼的數據庫中讀出中文字符串 s1 ,經過上述轉換過程,在支持 GBK 字符集的操作系統和應用軟件中就能夠正確顯示中文字符串 s2 。
  
  Java 中文問題的表層分析及處理
  
  背景
  
  開發環境
  JDK1.15
  Vcafe2.0
  JPadPro
  
  服務器端
  NT IIS
  Sybase System
  Jconnect(JDBC)
  
  客戶端
  IE5.0
  Pwin98
   
  
  .CLASS 文件存放在服務器端,由客戶端的浏覽器運行 APPLET , APPLET 只起調入 FRAME 類等主程序的作用。界面包括 Textfield ,TextArea,List,Choice 等。
  
  I.       取中文
  
  用 JDBC 執行 SELECT 語句從服務器端讀取數據(中文)後,將數據用 APPEND 方法加到 TextArea(TA) ,不能正確顯示。但加到 List 中時,大部分漢字卻可正確顯示。
  
  將數據按“ISO-8859-1” 編碼方式轉化為字節數組,再按系統缺省編碼方式 (Default Character Encoding) 轉化為 STRING ,即可在 TA 和 List 中正確顯示。
  
  程序段如下:
  
  dbstr2 = results.getString(1);
  
  //After reading the result from DB server,converting it to string.
  
  dbbyte1 = dbstr2.getBytes(“iso-8859-1”);
  
  dbstr1 = new String(dbbyte1);
  
  在轉換字符串時不采用系統默認編碼方式,而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 兩種情況下,從數據庫取數據都沒有問題。
  
  II.    寫中文到數據庫
  
  處理方式與“取中文”相逆,先將 SQL 語句按系統缺省編碼方式轉化為字節數組,再按“ISO-8859-1”編碼方式轉化為 STRING ,最後送去執行,則中文信息可正確寫入數據庫。
  
  程序段如下:
  
  sqlstmt = tf_input.getText();
  
  //Before sending statement to DB server,converting it to sql statement.
  
  dbbyte1 = sqlstmt.getBytes();
  
  sqlstmt = newString(dbbyte1,”iso-8859-1”);
  
  _stmt = _con.createStatement();
  
  _stmt.executeUpdate(sqlstmt);

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