Yun's profile无尽的探索PhotosBlogLists Tools Help

Blog


    June 19

    jQuery form提交时中文乱码 [转]

    关键字: ajax post 中文 乱码

    在使用jsp开始时,一不小心就会出现中文乱码的情况。通常可以使用如下方法解决:
    第一种解决方法:
    从jsp到servlet统一使用utf-8编码.全部使用utf-8编码能省去很多麻烦,但一点不足是utf-8编码对汉字是使用3-4个字节,会加大网络传输量。
    第二种方法:
    1.jsp页面使用GBK
    2.使用servlet过滤器设置request.setCharacterEncoding("GBK");google一下就能找到很多怎么使用过滤器转换编码。
    以上两种方法能解决大部分的乱码问题,特别是第一种方法,能解决使用ajax提交时的中文乱码问题。如果采用第二种方法,那么在使用ajax提交表单时仍然会有中文乱码。这是因为ajax方式提交时js使用的是utf-8的编码,过滤器使用gbk进行转码就不正确了,应该使用utf-8进行转码。要解决这个问题,网上也有很多个版本,其中一个是我曾经采用的在客户端使用encodeURI,然后再在服务器端进行URLDecoder.decode,这种方案在偶尔处理一下中文是可行的,但是如果页面有大量数据录入,那么这种方案是不可行的。有没有好的解决方法呢?在经过新一轮的google之后,还是找到了方法。参考http://www.javaeye.com/topic/157698?page=1。原理就是根据httpheader中的内容来区分是ajax方式请求还是普通的请求。在jquery1.2.6中,ajaxSettings默认设置contentType为"application/x-www-form-urlencoded",在ajax方法中设置xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");,我们只要在servlet中根据这两个参数值来判断是不是通过xmlhttprequest发起的请求。这里值得一提的是jquery在提交form时对参数进行了encodeURIComponent调用,参见param方法

    Java代码 复制代码

    1. jQuery.each( a, function(){   
    2.                 s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );   
    3.             }); 
    jQuery.each( a, function(){
    				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
    			});

    所以传给servlet的就是utf-8编码了,那么我们在过滤器中就必须使用utf-8进行转码。
    对其中的过滤器做了下修正,在IE下和chrome下,request.getContentType()的值为"application/x-www-form-urlencoded",但是在firefox下,这个值为"application/x-www-form-urlencoded; charset=UTF-8",不是很明白ff为什么会是这个值。
    filter代码如下:

    Java代码 复制代码

    1. package com.ajax.demo.action;   
    2. import java.io.IOException;   
    3. import javax.servlet.Filter;   
    4. import javax.servlet.FilterChain;   
    5. import javax.servlet.FilterConfig;   
    6. import javax.servlet.ServletException;   
    7. import javax.servlet.ServletRequest;   
    8. import javax.servlet.ServletResponse;   
    9. import javax.servlet.http.HttpServletRequest;   
    10. import javax.servlet.http.HttpServletResponse;   
    11. public class AjaxPostFilter implements Filter {   
    12. private static final String IE_CONTENT_TYPE = "application/x-www-form-urlencoded";   
    13. private static final String FF_AJAX_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8";   
    14. private static final String XMLHTTP_REQUEST = "XMLHttpRequest";   
    15. private static final String AJAX_CHARACTER_ENCODING_UTF8 = "UTF-8";   
    16. public void destroy() {   
    17. // TODO Auto-generated method stub
    18.     }   
    19. public void doFilter(ServletRequest servletRequest,   
    20.             ServletResponse servletResponse, FilterChain filterChain)   
    21. throws IOException, ServletException {   
    22.         HttpServletRequest request = (HttpServletRequest) servletRequest;   
    23.         HttpServletResponse response = (HttpServletResponse) servletResponse;   
    24.         String requestedWith = request.getHeader("x-requested-with");   
    25.         String type = request.getContentType();   
    26. if (XMLHTTP_REQUEST.equals(requestedWith)&& (FF_AJAX_CONTENT_TYPE.equals(type)   
    27.                 ||IE_CONTENT_TYPE.equals(type))) {   
    28.             request.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);   
    29.             response.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);   
    30. //          request.getParameterMap();
    31.         }   
    32.         filterChain.doFilter(request, response);   
    33.     }   
    34. public void init(FilterConfig arg0) throws ServletException {   
    35. // TODO Auto-generated method stub
    36.     }   
    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

    Java代码 复制代码

    1. <filter>   
    2.         <filter-name>ajaxEncodeFilter</filter-name>   
    3.         <filter-class>com.ajax.demo.action.AjaxPostFilter</filter-class>   
    4.     </filter>   
    5.     <filter-mapping>   
    6.         <filter-name>ajaxEncodeFilter</filter-name>   
    7.         <url-pattern>*.do</url-pattern>   
    8.     </filter-mapping>   
    9.     <filter-mapping>   
    10.         <filter-name>ajaxEncodeFilter</filter-name>   
    11.         <url-pattern>*.jsp</url-pattern>   
    12.     </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>

    这个filter应该在你的EncodeFilter之后,RoyMax说要在之前,我试了下是不行的。
    经过这样设置之后,jsp使用gbk采用ajax提交就不会存在中文乱码了。
    在使用chrome进行测试时,还发现chrome的一个奇怪问题,对于返回的结果,使用jquery.ajax处理

    Java代码 复制代码

    1. success:function showResponse(responseText, statusText)  {    
    2. //这里name为input text id,如果"aa"在前,那么name的值会改为aa+返回的结果
    3.                     $('#name').val("aa"+responseText);   
    4. //如果改成$('#name').val(responseText+"aa"),那么name的值仍然是//responseText,“aa”没有加到后面去,不知道是什么原因
    success:function showResponse(responseText, statusText)  { 
    //这里name为input text id,如果"aa"在前,那么name的值会改为aa+返回的结果
        				$('#name').val("aa"+responseText);
    //如果改成$('#name').val(responseText+"aa"),那么name的值仍然是//responseText,“aa”没有加到后面去,不知道是什么原因
    }
     
    参考:http://jasin2008.javaeye.com/blog/312854

    Comments

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Trackbacks

    The trackback URL for this entry is:
    http://fangyuncn.spaces.live.com/blog/cns!29C7193178944F5A!1738.trak
    Weblogs that reference this entry
    • None