response.setCharacterEncoding(charset);必須寫在PrintWriter out = request.getWriter()之前,這樣才能保證out按照已經設置的字符編碼來進行字符輸出。
通過過濾器,我們可以保證在Servlet或JSP執行之前就設置好了請求和響應的字符編碼。
但是這樣並不能完全解決中文亂碼問題:
對於post請求,無論是“獲取參數環節”還是“輸出環節"都是沒問題的;
對於get請求,"輸出環節"沒有問題,但是"獲取參數環節"依然出現中文亂碼,所以在輸出時直接將亂碼輸出了。
原因是post請求和get請求存放參數位置是不同的:
post方式參數存放在請求數據包的消息體中。get方式參數存放在請求數據包的請求行的URI字段中,以?開始以param=value¶me2=value2的形式附加在URI字段之後。而request.setCharacterEncoding(charset); 只對消息體中的數據起作用,對於URI字段中的參數不起作用。
當使用request.setCharacterEncoding(charset);時,只能解決表單方法爲POST的中文亂碼情況,而方法爲GET的依然爲亂碼。
解決GET亂碼:
String str = request.getParameter("URL後面的變量名");
byte b[] = str.getBytes("ISO-8859-1");
str = new String(b);