最近在學習web開發,遇到一個比較棘手的問題,就是web比較煩人的中文亂碼問題。
遇到此類問題,
我們也不必擔心。想想其中的原理,就可以排除很多問題。
先確定是那個環節的charset的問題。
一 從客戶端到伺服器的問題
一般從客戶端到伺服器端的問題主要使用者處理與頁面互動時產生的亂碼問題,例如提交表單等。具體驗證你可以列印一些語句出來看看。單獨做一個小實驗。
1.解決表單的 get 方式:
在這裡我們利用Tomcat來舉例子:
在server.xml中新增一項 useBodyEncodingForURI="true"
server.xml:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI="true" />
2.解決表單的post問題:
在未取得引數之前要設定
request.setCharacterEncoding("GBK");
這樣我們就解決了客戶端到伺服器端 的問題了。
如果這個環節沒有出現任何問題的話,那就是服務收到的資料往資料庫儲存的時候出現了問題,可能就是資料庫本身的編碼問題設定
二 伺服器到資料庫儲存出現的問題
這時我們可以設定資料庫的編碼形式就行了。
這裡我想要跟大家說的,還有演示的就是一種常見的解決方法,那就是利用filter來解決中文亂碼問題。
1.我們建立一個filter
EncodingFilter.class:
package com.softrc.filter;
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 String code;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(code);
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
code = filterConfig.getInitParameter("code");
}
}
相應在專案中的web.xml中配置下面的資訊,切忌要放在前面,因為過濾器是有順序的
web.xml:
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.softrc.filter.EncodingFilter</filter-class>
<init-param>
<param-name>code</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>