JavaWeb--中文亂碼小結
出處:http://chriszz.sinaapp.com
0.純粹html亂碼:
換個editor吧(有時候notepad都比sublime_text好用),最好是在<head></head>之間添加<meta charset="utf-8">
1.jsp到jsp之間,表單
(假設包含表單的頁面爲a,提交的action爲b)
get:不亂碼
post:亂碼(在b頁面用<%request.setCharacterEncoding("utf-8");%>)
超連接形式的跳轉,若是帶有參數,本質上仍是get方法,因此不會亂碼
2.jsp到jsp之間,轉發,轉發參數亂碼(<jsp:forward>+<jsp:param>)
須要在轉發標籤<jsp:forward>以前添加<%request.setCharacterEncoding("utf-8");%>
3.servlet頁面out對象輸出中文,亂碼
在相應的方法中添加response.setContentType("text/hmtl;charset=UTF-8");
4.jsp提交表單到servlet,servlet獲取表單變量亂碼
若表單是post方法:在servlet相應方法中添加request.setCharacterEncoding("UTF-8");
若表單是get方法:在servlet相應方法中添加request.setCharacterEncoding("UTF-8");,或者用getBytes轉碼並構造新的String,例如;
String username = request.getParameter("username");
String name = new String(username.getBytes("ISO-8859-1"), "UTF-8");
總結一下:
對於post方法提交的表單,獲取表單數據的頁面都要用request.setCharacterEncoding("UTF-8");對於get方式提交的表單,獲取表單數據的頁面既能夠用request.setCharacterEncoding("UTF-8")也能夠用getBytes()的方法構造新的String;對於使用<jsp:param>傳遞參數的狀況,須要在傳遞參數前設定request.setCharacterEncoding("UTF-8");html
/******************************************************************************/java
通過@小沫9的提醒,我寫了一個編碼過濾器 EncodingFilter.java,並在web.xml中進行了配置。經過測試,jsp提交表單到jsp頁面、jsp提交表單到servlet、 jsp使用傳遞參數、Servlet頁面用out對象輸出,每種狀況均可以再也不設定 request.setCharacterEncoding(「UTF-8″),由於過濾器已經搞定了一切編碼。代碼入下:web
1 package chris.filter 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 public class PageEncodingFilter implements Filter{ 15 16 private String encoding = "UTF-8"; 17 protected FilterConfig filterConfig; 18 19 20 public void init(FilterConfig filterConfig) throws ServletException { 21 this.filterConfig = filterConfig; 22 //本過濾器默認編碼是UTF-8,但也能夠在web.xml配置文件裏設置本身須要的編碼 23 if(filterConfig.getInitParameter("encoding") != null) 24 encoding = filterConfig.getInitParameter("encoding"); 25 } 26 27 public void doFilter(ServletRequest srequset, ServletResponse sresponse, 28 FilterChain filterChain) throws IOException, ServletException { 29 HttpServletRequest request = (HttpServletRequest)srequset; 30 request.setCharacterEncoding(encoding); 31 HttpServletResponse response = (HttpServletResponse)sresponse; 32 response.setCharacterEncoding(encoding); 33 filterChain.doFilter(srequset, sresponse); 34 } 35 36 public void destroy() { 37 this.encoding = null; 38 } 39 40 }
相應地,我在web.xml中的filter則設定爲:app
1 <filter> 2 <filter-name>Encoding</filter-name> 3 <filter-class>chris.filter.PageEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>UTF-8</param-value> 7 </init-param> 8 </filter> 9 10 <filter-mapping> 11 <filter-name>Encoding</filter-name> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping>