requset.setCharacterEncodingt()亂碼問題

一、request.setCharacterEncoding():用來確保發往服務器的參數以漢字的編碼來提取,設置從request中取得的值或從數據庫中取出的值。

指定後可以通過request.getParameter()獲取自己想要的字符串,如果沒有提前指定,則會按照服務器端默認的“iso-8859-1”來進行編碼;該方法只對post請求有效,對get請求無效;對於get請求,應該在server.xml中指定:URIEncoding=utf-8

注意:在執行request.setCharacterEncoding()之前不能執行request.getParameter()方法;

原因:應該是在執行第一個getParameter()的時候,Java將會按照編碼分析所有的提交內容,而後續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對於GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析提交內容,setCharacterEncoding()自然就無效。

二、response.setCharacterEncoding():設置HTTP 響應的編碼,用於設置服務器給客戶端的數據的編碼

一般不會用這個方法來設置響應編碼,

一般使用response.setContentType()方法來設置HTTP 響應的編碼同時指定了瀏覽器顯示的編碼;

因爲他在執行該方法通知服務器端以指定編碼進行編碼後,會自動調用response.setCharacterEncoding()方法來通知瀏覽器以指定編碼來解碼;使用此方法要在response.getWriter()執行之前或response提交之前;


再 明確一點: 字節流<------>字符流 的相互轉換  ,例如: 

                   
Java代碼  收藏代碼
  1. String s = "中文";  
  2.     byte[] bs2 = s.getBytes("utf-8");  
  3.     String s1 = new String(bs2,"iso-8859-1");  
  4.     String s2 = new String(bs2,"utf-8");  
  5.     String s3 = new String(s1.getBytes("iso-8859-1"),"utf-8");  
  6.     System.out.println(s1+"\n"+s2+"\n"+s3);  
              輸出結果: 
                   
Java代碼  收藏代碼
  1. ??????  
  2. 中文  
  3. 中文  


以下適合POST 提交以上例子說明 兩點: 
1、字節流到字符流的 正向和反向 的編碼格式要一致,才能正確轉換,否則只會得到亂碼。2、s1 由 不一致的 編碼格式 iso-8859-1 轉換成亂碼後,可以再次還原爲字節流,最後使用一致的編碼格式得到正確的中文 

好,明白這一點,第一我們首先看 request ,從瀏覽器到服務器的請求過程,form表單的提交信息需要 經過編碼(什麼編碼??想一想,我們如何知道) 轉爲字節流,而後(這裏講tomcat)服務器會 逆向把字節流 通過默認編碼iso-8859-1來還原爲字符流,此時我們使用request.getParameter("XX")得到的東東是正確?還是亂碼? 關鍵問題是:form表單提交時轉換字節流時的 編碼格式(A)   和   tomcat 把字節流轉回字符流的 編碼格式(B) 一致嗎? 
編碼格式(B)=“iso-8859-1” 
編碼格式(A)我們從下面圖中找:圖示爲簡體中文(GB2312) 
 

結果亂碼。 
簡單的解決方法: 
Java代碼  收藏代碼
  1. new String(request.getParameter("XX").getBytes("ISO-8859-1"),"GB2312")//每個參數都要這樣做,代碼重複  

或者 
Java代碼  收藏代碼
  1. request.setCharacterEncoding("GB2312");  
  2. request.getParameter("XX")//至少每個獲取參數的地方需要寫一次  


OK! 問題是解決了,好點的辦法:使用過濾器(如何實現?百度就可以)所有的請求都過濾。一次性了事。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章