前段時間公司做feinar旅行網後台管理系統的開發,我和我的同事都是第一次真正參與這種大型的項目開發,在開發過程中,我們也曾幾次遇到中文亂碼的問題,很是困惑和苦惱,到網上去查,那些所謂的解決方案都不湊效,幾經周折後,終於徹底解決了這個問題。通過查資料和多方面的綜合考慮,最終得出了自己的的解決方案:
首先,確保你的資料庫是支援中文的。把資料庫的編碼方式設定能支援中文的,如GB2132,utf-8等,而且經過測試後確實能寫入中文且正常顯示。這樣就就保證了資料庫確實是支援中文的,且可以正常輸入和儲存中文。如果資料庫本身都不支援中文字元,那不管你怎麼寫代碼都是無濟於事的,肯定會出現中文亂碼。
其次,從輸入源杜絕中文亂碼出現的可能。只有從資料輸入源杜絕了中文亂碼出現的可能,才能保證輸入到資料庫中的是正確的字元,加上我們第一步的保障,那麼就保證了從資料庫中讀取的資料的正確性,從而也就保證了程式從資料庫中讀取的資料不會出現中文亂碼成為可能。解決方案:
解決方案一:從頁面輸入杜絕亂碼出現的可能
1、在jsp輸入頁面中加入:
<%@pagecontentType="text/html;charset=資料庫字元集"% >
2、在html標籤的<head>的第一行加入
<meta http-equiv="Content-Type" content="text/html; charset=資料庫字元集" />
解決方案二:使用javax.servlet.Filter
1、編寫web.xml配置。在
這樣就可以保證頁面發送的資料的編碼與資料庫編碼一致,這樣從資料庫中讀取的資料就是你想要的正確字元了,你可放心的讀取了
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.morecans.test.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、編寫Filterservlet:com.morecans.test.EncodingFilter
package com.morecans.test;
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;
public class EncodingFilter implements Filter ...{
private FilterConfig config;
public void destroy() ...{
System.out.println("*** destroy EncodingFilter");
}
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException ...{
System.out.println("*** doFilter EncodingFilter");
String charset = this.config.getInitParameter("charset");
servletrequest.setCharacterEncoding(charset); //設
servletresponse.setCharacterEncoding(charset);
filterchain.doFilter(servletrequest, servletresponse);
}
public void init(FilterConfig filterconfig) throws ServletException ...{
this.config = filterconfig;
System.out.println("*** init EncodingFilter");
}
}
最後,在輸出處避免亂碼的出現。只有把輸出控制好了,那麼我們前面的工作就沒有白費,前面的辛苦才會得到承認,才能得到收穫。這一步,很簡單,甚至都可以不要,因為我們前面的兩步基本把這一步的工作也做了,我是說如果編碼規範的話。然而,千裡之堤,潰於蟻穴!行百裡者半九十!希望前面的準備工作不會是徒勞,這是我們不原意看到的,所以在治理我還是建議不要因為這麼一小步而錯過了收穫的季節。解決方案:
現在,你只需要在讀取資料之前加上
request.setCharacterEncoding(資料庫字元集);
response.setCharacterEncoding(資料庫字元集);
而在jsp資料顯示頁面也像輸出頁面那樣加上
<%@pagecontentType="text/html;charset=資料庫字元集"% >
<meta http-equiv="Content-Type" content="text/html; charset=資料庫字元集" />
整個過程,從源頭到源尾,徹底的監視著資料的一舉一動,時刻修正著資料的模樣和流向,從而徹底消滅中文亂碼這個惡魔的出現。
摘錄來源:http://blog.csdn.net/morecans/archive/2007/07/15/1691860.aspx —— Morecans的專欄