在使用jsp開始時(shí),一不小心就會(huì)出現(xiàn)中文亂碼的情況。通常可以使用如下方法解決:
第一種解決方法:
從jsp到servlet統(tǒng)一使用utf-8編碼.全部使用utf-8編碼能省去很多麻煩,但一點(diǎn)不足是utf-8編碼對漢字是使用3-4個(gè)字節(jié),會(huì)加大網(wǎng)絡(luò)傳輸量。
第二種方法:
1.jsp頁面使用GBK
2.使用servlet過濾器設(shè)置request.setCharacterEncoding("GBK");google一下就能找到很多怎么使用過濾器轉(zhuǎn)換編碼。
以上兩種方法能解決大部分的亂碼問題,特別是第一種方法,能解決使用ajax提交時(shí)的中文亂碼問題。如果采用第二種方法,那么在使用ajax提交表單時(shí)仍然會(huì)有中文亂碼。這是因?yàn)閍jax方式提交時(shí)js使用的是utf-8的編碼,過濾器使用gbk進(jìn)行轉(zhuǎn)碼就不正確了,應(yīng)該使用utf-8進(jìn)行轉(zhuǎn)碼。要解決這個(gè)問題,網(wǎng)上也有很多個(gè)版本,其中一個(gè)是我曾經(jīng)采用的在客戶端使用encodeURI,然后再在服務(wù)器端進(jìn)行URLDecoder.decode,這種方案在偶爾處理一下中文是可行的,但是如果頁面有大量數(shù)據(jù)錄入,那么這種方案是不可行的。有沒有好的解決方法呢?在經(jīng)過新一輪的google之后,還是找到了方法。參考
http://www.iteye.com/topic/157698?page=1。原理就是根據(jù)httpheader中的內(nèi)容來區(qū)分是ajax方式請求還是普通的請求。在jquery1.2.6中,ajaxSettings默認(rèn)設(shè)置contentType為"application/x-www-form-urlencoded",在ajax方法中設(shè)置xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");,我們只要在servlet中根據(jù)這兩個(gè)參數(shù)值來判斷是不是通過xmlhttprequest發(fā)起的請求。這里值得一提的是jquery在提交form時(shí)對參數(shù)進(jìn)行了encodeURIComponent調(diào)用,參見param方法
- jQuery.each( a, function(){
- s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
- });
jQuery.each( a, function(){
s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
});
所以傳給servlet的就是utf-8編碼了,那么我們在過濾器中就必須使用utf-8進(jìn)行轉(zhuǎn)碼。
對其中的過濾器做了下修正,在IE下和chrome下,request.getContentType()的值為"application/x-www-form-urlencoded",但是在firefox下,這個(gè)值為"application/x-www-form-urlencoded; charset=UTF-8",不是很明白ff為什么會(huì)是這個(gè)值。
filter代碼如下:
- package com.ajax.demo.action;
-
- 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.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- public class AjaxPostFilter implements Filter {
-
- private static final String IE_CONTENT_TYPE = "application/x-www-form-urlencoded";
- private static final String FF_AJAX_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8";
- private static final String XMLHTTP_REQUEST = "XMLHttpRequest";
- private static final String AJAX_CHARACTER_ENCODING_UTF8 = "UTF-8";
-
- public void destroy() {
-
-
- }
-
- public void doFilter(ServletRequest servletRequest,
- ServletResponse servletResponse, FilterChain filterChain)
- throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) servletRequest;
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- String requestedWith = request.getHeader("x-requested-with");
- String type = request.getContentType();
- if (XMLHTTP_REQUEST.equals(requestedWith)&& (FF_AJAX_CONTENT_TYPE.equals(type)
- ||IE_CONTENT_TYPE.equals(type))) {
- request.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);
- response.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);
-
- }
- filterChain.doFilter(request, response);
-
- }
-
- public void init(FilterConfig arg0) throws ServletException {
-
-
- }
-
- }
package com.ajax.demo.action;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AjaxPostFilter implements Filter {
private static final String IE_CONTENT_TYPE = "application/x-www-form-urlencoded";
private static final String FF_AJAX_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8";
private static final String XMLHTTP_REQUEST = "XMLHttpRequest";
private static final String AJAX_CHARACTER_ENCODING_UTF8 = "UTF-8";
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requestedWith = request.getHeader("x-requested-with");
String type = request.getContentType();
if (XMLHTTP_REQUEST.equals(requestedWith)&& (FF_AJAX_CONTENT_TYPE.equals(type)
||IE_CONTENT_TYPE.equals(type))) {
request.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);
response.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);
// request.getParameterMap();
}
filterChain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml配置,我用的是struts
- <filter>
- <filter-name>ajaxEncodeFilter</filter-name>
- <filter-class>com.ajax.demo.action.AjaxPostFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>ajaxEncodeFilter</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>ajaxEncodeFilter</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
<filter>
<filter-name>ajaxEncodeFilter</filter-name>
<filter-class>com.ajax.demo.action.AjaxPostFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ajaxEncodeFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ajaxEncodeFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
這個(gè)filter應(yīng)該在你的EncodeFilter之后,RoyMax說要在之前,我試了下是不行的。
經(jīng)過這樣設(shè)置之后,jsp使用gbk采用ajax提交就不會(huì)存在中文亂碼了。
在使用chrome進(jìn)行測試時(shí),還發(fā)現(xiàn)chrome的一個(gè)奇怪問題,對于返回的結(jié)果,使用jquery.ajax處理
- success:function showResponse(responseText, statusText) {
-
- $('#name').val("aa"+responseText);
-
success:function showResponse(responseText, statusText) {
//這里name為input text id,如果"aa"在前,那么name的值會(huì)改為aa+返回的結(jié)果
$('#name').val("aa"+responseText);
//如果改成$('#name').val(responseText+"aa"),那么name的值仍然是//responseText,“aa”沒有加到后面去,不知道是什么原因
}