解決辦法:
步驟1. 加過濾器,即在filter裡的init()裡加上request.setCharacterEncoding("utf-8");相當於每個頁面的編碼都是utf-8,
步驟2. 將表單提交方法改成post方式,至於get方式的解決目前還不知道
上面兩個步驟保證了資料在提交給背景過程中不亂碼
步驟3. 資料庫裡面需要中文的欄位的類型都改成nvarchar,保證資料寫入資料庫的時候不亂碼
最後,在頁面的<%@ page contentType="text/html;charset=utf-8" language="java"%>charset=utf-8"寫成utf-8保證在輸出的時候編碼為utf-8
下面的網上的一些說法:
其實這是個很普遍的問題,網上也有很多的文章去全面的解釋jsp中文亂碼的問題。在這裡我只是想說一下get方式提交表單時的中文亂碼解決方案。
現在做系統的時候,為瞭解決中文的亂碼問題,我們通常會配置一個編碼過濾器,比如我們直接用Spring給我們提供的編碼過濾器
<!-- 編碼過濾器 -->
<filter>
<filter-name>Spring character encoding filter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Spring character encoding filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這段配置就相當於在代碼中寫了如下代碼:
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
另外也可以自訂過濾器
1 建立ChineseFilter類。 package spell; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ChineseFilter extends HttpServlet implements Filter { private FilterConfig filterConfig; //Handle the passed-in FilterConfig public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } //Process the request/response pair public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { String encoding=filterConfig.getInitParameter("encoding");//從WEB.xml設定檔中取出參數,這樣我們可以通過配置修改編碼格式. request.setCharacterEncoding(encoding);//佈建要求的編碼格式 filterChain.doFilter(request, response); } catch (ServletException sx) { filterConfig.getServletContext().log(sx.getMessage()); } catch (IOException iox) { filterConfig.getServletContext().log(iox.getMessage()); } } //Clean up resources public void destroy() { } protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub super.doGet(arg0, arg1); } protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(arg0, arg1); } } 2 web.xml配置(注意:jsp/servlet2.3以上版本才支援filter,所以前面應該改為<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">) <filter> <filter-name>ChineseFilter</filter-name> <filter-class>spell.ChineseFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>ChineseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在jsp頁面中,設定頁面的儲存編碼和頁面輸出時的編碼:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
這樣,就統一了編碼為utf-8。
這種方式在post提交表單中含有中文時沒有問題。但是在用get提交時,如果含有中文,就會出現類似於“。 。 。”的亂碼問題。為什麼會這樣呢,造成這種現象的原因是Tomcat對get和post兩種提交方式的處理方法不一樣造成的。自從Tomcat5.x開始,GET和POST方法提交的資訊,Tomcat採用了不同的方式來處理編碼,對於POST請求,Tomcat會仍然使用request.setCharacterEncoding方法所設定的編碼來處理,如果未設定,則使用預設的iso-8859-1編碼。而GET請求則不同,Tomcat對於GET請求並不會考慮使用request.setCharacterEncoding方法設定的編碼,而會永遠使用iso-8859-1編碼。
解決辦法如下:
1.配置tomcat的設定檔server.xml裡這句:
<Connector URIEncoding="GB2312"
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
加上這句:URIEncoding="GB2312"
2.使用String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");轉化編碼
推薦使用第二種方式。