一、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提交之前;
再 明確一點: 字節流<------>字符流 的相互轉換 ,例如:
- String s = "中文";
- byte[] bs2 = s.getBytes("utf-8");
- String s1 = new String(bs2,"iso-8859-1");
- String s2 = new String(bs2,"utf-8");
- String s3 = new String(s1.getBytes("iso-8859-1"),"utf-8");
- System.out.println(s1+"\n"+s2+"\n"+s3);
- ??????
- 中文
- 中文
以下適合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)
結果亂碼。
簡單的解決方法:
- new String(request.getParameter("XX").getBytes("ISO-8859-1"),"GB2312")//每個參數都要這樣做,代碼重複
或者
- request.setCharacterEncoding("GB2312");
- request.getParameter("XX")//至少每個獲取參數的地方需要寫一次
OK! 問題是解決了,好點的辦法:使用過濾器(如何實現?百度就可以)所有的請求都過濾。一次性了事。