李晓亮的博客

导航

[摘]javaeye论坛中关于AJAX中文乱码问题的讨论摘录

摘自:http://www.javaeye.com/topic/456553?page=4

1.页面的所有编码设置(包括meta 标签)都设成utf-8
2.后台加个字符编码过滤器,主要代码就是
Java代码 
httpServletRequest.setCharacterEncoding("UTF-8"); 

若要输出内容,则输出之前加
Java代码 
httpServletResponse.setCharacterEncoding("utf-8");

---------------------------------------------------------------

在页面encodeURI()一次,在后台URLDecoder.decode(request.getParameter(“参数名”), "utf8")

 

页面Ajax部分:
var url = '/sample.do?name=' + encodeURIComponent('中文名字');
new Ajax.Request(url, {  
   method: 'get', 
   encoding:'UTF-8' ,
   onSuccess: function(transport) {    
   var notice = $('notice');  
   if(transport.responseText!=null)  {
      notice=transport.responseText;
      alert(notice);
   }
 }
});

在Servlet或Action里
String str=request.getParameter("name");
response.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=utf-8");
response.getWriter().write(str);

---------------------------------------------------------------

有这么几种做法,很常见:

1.客户端提交时使用encodeURI或者encodeurIcompent参数来进行utf-8编码,然后发送给服务器,如果使用post方式的话可以通过request.setCharacterEncoding来设定用来解读参数的编码。如果用get方式的话,使用new String(arg.getBytes("iso-8859-1"),"utf-8")的方式来转码。

2.发送ajax请求时,请使用post方式,由于AJAX默认使用utf-8的编码提交参数,因此如果不是文件上传得话,为ajax的Content-Type请求头设置"application/x-www-form-urlencoded;charset="utf-8",以此来通知服务器,客户端发送参数所使用的编码。这样,服务器端可以直接通过String word = request.getParameter("word");来获取经过转码后的参数值,省去了request.setCharacterEncoding。

---------------------------------------------------------------
清一色UTF8,然后Ajax的get里有中文的时候encodeURIComponent一下;
utf-8 ,一定要处理 http 头中的编码格式
---------------------------------------------------------------

最老土的办法末过于结合 getByte,new String (...,'编码格式') 最终转化为所需要的中文字符;
下面介绍一个不需要如此烦琐的方法来实现,也许你们已经知道
-------------------------------------------------------------------
ajax默认中文提交以utf-8格式,所以只需要在你的web服务加个过滤器,设置下编码格式即可;
1.注意为防止编码设置无效,请在编码设置完后,显示调用下request.getParameter("");(tomcat5.0测试通过)
据说其他服务器,可能显示调用了,也有可能被服务器重置;
2.有时已经有filter需要设置gbk编码,为了不影响原先的filter功能,我是直接在ajax提交时候,带个服务端要设置的编码格式 例如 Ajax.request("/myaction.do?charset=utf-8")
服务端filter,要用request.getQueryString() 截取charset值 ,注意千万不要用request.getParameter("charset");
3.注意,在没设置编码格式前,不要加 watch监控 比如有个表达式 request.getParameter("*");

核心代码如下:
public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        try {
        
                String queryString = httpRequest.getQueryString();
                //获取浏览器提交的charset
                String charset = (String)HttpUtil.getParams(queryString).get("charset");
                if(charset!=null){
                    httpRequest.setCharacterEncoding(charset);
                }
                else{
                    httpRequest.setCharacterEncoding("gbk");
                }
                //使编码生效,在这之前不要调用request.getParameter

request.getParameter("");

        } catch (UnsupportedEncodingException e) {
        }
        // move on to the next
        chain.doFilter(request, response);
    }
---------------------------------------------------------------

试试这个filter,记得要放到你的Filter最前端,特别是你的EncodeFilter前面
Java代码 
public void doFilter(ServletRequest servletRequest,  
            ServletResponse servletResponse, FilterChain filterChain)  
            throws IOException, ServletException {  
        if (logger.isDebugEnabled()) {  
            logger  
                    .debug("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$  
        }  
 
        HttpServletRequest request = (HttpServletRequest) servletRequest;  
        HttpServletResponse response = (HttpServletResponse) servletResponse;  
 
        String requestedWith = request.getHeader("x-requested-with");  
        String type = request.getContentType();  
        if (requestedWith != null && "XMLHttpRequest".equals(requestedWith)  
                && null != type  
                && "application/x-www-form-urlencoded".equals(type)) {  
            logger.info("This's ajax post.set encode is UTF-8.");  
            request.setCharacterEncoding("UTF-8");  
            response.setCharacterEncoding("UTF-8");  
            request.getParameterMap();  
        }  
 
        filterChain.doFilter(request, response);  
 
        if (logger.isDebugEnabled()) {  
            logger  
                    .debug("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$  
        }  
    }  


Java代码 
<filter>  
    <filter-name>encodingFilter</filter-name>  
    <filter-class>  
        org.springframework.web.filter.CharacterEncodingFilter  
    </filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>GBK</param-value>  
    </init-param>  
    <init-param>  
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter>  
    <filter-name>ajaxEncodeFilter</filter-name>  
    <filter-class>  
        com.pengpeng.framework.common.filter.AjaxEncodeFilter  
    </filter-class>  
</filter>
---------------------------------------------------------------

 

ajax默认中文提交以utf-8格式,所以只需要在你的web服务加个过滤器,设置下编码格式即可;
1.注意为防止编码设置无效,请在编码设置完后,显示调用下request.getParameter("");(tomcat5.0测试通过)
据说其他服务器,可能显示调用了,也有可能被服务器重置;
2.有时已经有filter需要设置gbk编码,为了不影响原先的filter功能,我是直接在ajax提交时候,带个服务端要设置的编码格式 例如 Ajax.request("/myaction.do?charset=utf-8")
服务端filter,要用request.getQueryString() 截取charset值 ,注意千万不要用request.getParameter("charset");
3.注意,在没设置编码格式前,不要加 watch监控 比如有个表达式 request.getParameter("*");
首先分析通过正常GET,Post提交页面和AJAX提交页面有什么不同看截图
Get ,Post正常方式提交数据

AJAX方式提交数据

主意AJAX多了个x-requested-with信息所以可以采用获取HTTP Header方法来判断是采用那种提交方式提交数据的所以
主要代码如下
Java代码 
public void doFilter(ServletRequest request, ServletResponse response,   
FilterChain chain) throws IOException, ServletException {   
 
// Conditionally select and set the character encoding to be used   
HttpServletRequest httpRequest = (HttpServletRequest) request;   
 
HttpServletResponse httpResponse = (HttpServletResponse) response;   
 
String requestedWith = httpRequest.getHeader("x-requested-with");   
String type = request.getContentType();   
if (requestedWith != null && "XMLHttpRequest".equals(requestedWith)   
&& null != type   
&& "application/x-www-form-urlencoded".equals(type)) {   
httpRequest.setCharacterEncoding("UTF-8");   
httpResponse.setCharacterEncoding("UTF-8");   
httpRequest.getParameterMap();   
} else {   
 
request.setCharacterEncoding("gbk");   
response.setContentType("text/html;charset=" + "gbk");   
 
}   
chain.doFilter(request, response);   
 
}
---------------------------------------------------------------

---------------------------------------------------------------
 

posted on 2011-03-26 15:23  LeeXiaoLiang  阅读(158)  评论(0)    收藏  举报