孫鑫原創系列-----Java中文亂碼問題的解決方案
[關鍵字: 孫鑫 java 亂碼 ]
Java中文亂碼問題的解決方案
只要掌握了中文亂碼問題產生的原因,然後對症下藥,就可以順利地解決這些問題。下面我們對容易產生亂碼問題的情境進行分析,並提出解決方案。1.以POST方法提交的表單資料中有中文字元由於Web容器預設的編碼方式是ISO-8859-1,在Servlet/JSP程式中,通過請求對象的getParameter()方法得到的字串是以ISO-8859-1轉換而來,這是導致亂碼產生的原因之一。為了避免容器以ISO-8859-1的編碼方式返回字串,對於以POST方法提交的表單資料,可以在擷取請求參數值之前,調用request.setCharacterEncoding("GBK"),明確指定請求本文使用的字元編碼方式是GBK。在向瀏覽器發送中文資料之前,調用response.setContentType("text/html;charset=GBK"),指定輸出內容的編碼方式是GBK。對於JSP頁面,在擷取請求參數值之前,寫上下面的代碼:<%request.setCharacterEncoding("GB2312");%>為了指定輸出內容的編碼格式,設定page指令contentType屬性,如下:<%@ page contentType="text/html; charset=GBK" %>在Web容器轉換JSP頁面後的Servlet類中,會自動添加下面的代碼:response.setContentType("text/html; charset=GBK");2.以GET方法提交的表單資料中有中文字元當提交表單採用GET方法時,提交的資料作為查詢字串被附加到URL的末端,發送到伺服器,此時在伺服器端調用setCharacterEncoding()方法也就沒有作用了。我們需要在得到請求參數的值後,自己做正確的編碼轉換。String name = request.getParameter("name");name=new String(name.getBytes("ISO-8859-1"),"GBK");在第一行,調用getParameter()方法得到的字串name的Unicode值是以ISO-8859-1編碼轉換而來,調用name.getBytes("ISO-8859-1"),將得到原始的GBK編碼值,接著,對new String()的調用將以GBK字元集重新構造字串的Unicode編碼。為了方便從ISO-8859-1編碼到GBK的轉換,我們可以編寫一個工具方法,如下:public String toGBK(String str) throws java.io.UnsupportedEncodingException{ return new String(str.getBytes("ISO-8859-1"),"GBK");}3.在資料庫中儲存和讀取中文資料對於大多數資料庫的JDBC驅動程式,在Java程式和資料庫之間傳遞資料都是以ISO-8859-1為預設編碼格式,所以,我們在程式中向資料庫儲存包含中文的資料時,JDBC驅動程式首先把程式內部的Unicode編碼格式的資料轉化為ISO-8859-1編碼,然後傳遞到資料庫中,加上資料庫本身也有字元集,這就是為什麼我們常常在資料庫中讀取中文資料時,讀到的是亂碼。要解決上述問題,只需要將資料庫預設的編碼格式改為GBK或GB2312即可,不同的資料庫還提供了另外的方式來處理字元編碼轉換的問題,讀者在實際應用過程中,可針對具體情況再做具體處理,只要理解了編碼轉換的過程,就能找到問題的所在,進而解決問題。4.Servlet/JSP在不同語言系統的平台下運行有時候,我們在中文系統平台下開發的Web應用程式移植到英文系統平台下,在Servlet和JSP中直接書寫的中文字串在輸出時,將顯示為亂碼。這是因為在編譯Servlet類或者JSP檔案時,如果沒有使用-encoding參數指定Java來源程式的編碼格式,javac會擷取本地作業系統預設採用的字元集,以該字元集將Java來源程式轉換為Unicode編碼儲存到記憶體中,然後將來源程式編譯為位元組碼檔案(位元組碼檔案採用的是UTF-8編碼),儲存到硬碟上。在英文平台下,採用的預設編碼格式是ISO-8859-1,所以在編譯轉換後,執行輸出時,原先在源檔案中書寫的中文字串就變成了亂碼。要解決這個問題,在編譯Servlet類的來源程式時,可以用-encoding參數指定編碼為GBK或GB2312,例如:javac –encoding GBK HelloServlet.java對於JSP頁面,只要在page指令中用contentType屬性或pageEncoding屬性指定編碼格式為GBK或GB2312,Web容器就可以正確轉換和編譯JSP檔案了。例如:<%@ page contentType="text/html; charset=GBK" %>或<%@ page pageEncoding="GBK" %>在實際的Web應用中,亂碼問題產生的原因多種多樣,然而只要我們理解了字元編碼的轉換過程,仔細地分析亂碼產生的原因,找到問題的關鍵,就能對症下藥,解決問題。+-------------------------存到部落格裡沒事就看看 。老是在中文亂碼問題上 犯糊塗。