getParameter方法的中文問題【轉】

licanqiu1985發表於2011-06-30
終於找到了中文亂碼的解決方法,摘錄如下:

ServletRequest介面中定義了一個getCharacterEncoding方法,該方法用於返回請求訊息中的實體內容的字符集編碼名稱。如果請求訊息中沒有指定實體內容的字符集編碼名稱,則getCharacterEncoding方法返回null。

ServletRequest介面中定義了一個 setCharacterEncoding方法,該方法用於覆蓋請求訊息中的實體內容的字符集編碼名稱的設定。getParameter和getReader方法將讀取到的實體內容從位元組陣列形態轉換成字串返回時,都要參照請求訊息中的實體內容的字符集編碼名稱,所以,setCharacterEncoding方法應早於getParameter或getReader方法之前進行呼叫。

ServletRequest物件的getParameter等方法以哪種字符集編碼對引數進行URL編碼,需記下以下三種情況:

(1) 對於HTTP請求訊息的請求行中的URL地址後的引數,getParameter等方法進行URL解碼時所採用的字符集編碼在Servlet規範中沒有明確規定,它由各個Servlet引擎廠商自行決定。對於這種情況,Tomcat中的ServletRequest物件的getParameter等方法預設採用ISO8859-1字符集編碼進行URL解碼,因此無法返回正確的中文引數資訊。

(2) 對於POST方式下的”application/x-www-form-urlencoded”編碼格式的實體內容,getParameter等方法以ServletRequest物件的getCharacterEncoding方法返回的字符集編碼對其進行URL解碼。事實上,對於IE瀏覽器產生的HTTP請求訊息中沒有通過任何方式指定對實體內容進行URL編碼所採用的字符集編碼,那麼,Servlet引擎將無法知道請求訊息中的實體內容的字符集編碼,getCharacterEncoding()方法的返回值為null。對於這種情況,ServletRequest物件的getParameter等方法將使用預設的ISO8859-1字符集編碼對實體內容中的引數進行URL解碼,因此也將無法返回正確的中文引數資訊。

(3) ServletRequest介面中定義了一個 setCharacterEncoding方法來設定請求訊息中的實體內容的字符集編碼名稱,getParameter方法將以該方法設定的字符集編碼對實體內容進行URL解碼,所以,只要使用ServletRequest.setCharacterEncoding方法設定實體內容的字符集編碼為其URL編碼前的字符集編碼,那麼getParameter方法就可以從實體內容返回正確的中文引數資訊。但是,應該注意一點:ServletRequest.setCharacterEncoding方法設定的是請求訊息中的實體內容的字符集編碼名稱,它隻影響getParameter方法對POST方式下的”application/x-www-form-urlencoded”編碼格式的實體內容進行URL解碼的結果,而不能影響getParameter方法對HTTP請求訊息的請求行中的URL地址後的引數進行URL解碼的結果。

以上摘自:張孝祥《深入體驗Java Web開發內幕—核心基礎》電子工業出版社 06/10

例如:

請求: search/index.jsp?q=中國

得到引數:

String q = request.getParameter("q");
q = new String(q.getBytes("ISO-8859-1"), "GBK");//字元轉換
System.out.println(q);//顯示“中國”

相關文章