ajax传值中文乱码问题。。

本文转自:http://blog.csdn.net/avinegar/article/details/8084656貌似这哥们也是转的。不管了,嘿嘿学习为目的。

 

AJAX传值时采用的是UTF-8编码格式,客户端中文字符传输到服务器端时,如果服务器编码格式或者所采用的MVC框架的编码格式不是UTF-8,则很可能会出现中文乱码。解决办法如下:

客户端用js函数encodeURI()对中文字符进行两次编码,服务器端采用URLDecoder类对客户端传输过来的中文字符进行UTF-8格式的解码。示例:

[javascript] view plain copy print ?
  1. $.ajax({  
  2. type: "post",  
  3. url: "createNewGroup.action",  
  4. data:"name="+encodeURI(encodeURI("张三")),  
  5. success: function(msg){  
  6. alert(msg);  
  7. }  
  8. });  
$.ajax({
type: "post",
url: "createNewGroup.action",
data:"name="+encodeURI(encodeURI("张三")),
success: function(msg){
alert(msg);
}
});
服务器端代码:
  1. String name = URLDecoder.decode("客户端传输过来的中文字符","UTF-8");  
String name = URLDecoder.decode("客户端传输过来的中文字符","UTF-8");

服务器端往客户端传输中文字符出现乱码时,服务器端可采用URLEncoder类对中文字符进行UTF-8格式的编码。客户端采用js函数decodeURI()对服务器端传输过的中文字符进行两次解码。

当服务器端传输的是一个json串时,且不可对整个json串进行UTF-8格式的编码(编码后的json串有可能不再具有json原有格式),可采用JsonValueProcessor接口和JsonConfig类对json串中的value进行单独编码。

示例代码:

  1. JsonConfig jsonConfig = new JsonConfig();  
  2. jsonConfig.registerJsonValueProcessor(String.class,  
  3. new JsonValueProcessor(){  
  4. public Object processArrayValue(Object value, JsonConfig jsonConfig) {  
  5. return process(value);  
  6. }  
  7.   
  8. public Object processObjectValue(String key, Object value,  
  9. JsonConfig jsonConfig) {  
  10. return process(value);  
  11. }  
  12.   
  13. /** 
  14. * process 
  15. * @param value 
  16. * @return 
  17. */  
  18. public Object process(Object value) {  
  19. try {  
  20. if (value instanceof String) {  
  21.   
  22. return URLEncoder.encode(value.toString(),"UTF-8");  
  23. }  
  24. return value == null ?"" : value.toString();  
  25. catch (Exception e) {  
  26. return "";  
  27. }  
  28.   
  29. }  
  30.   
  31. });  
  32.   
  33. JSONArray json = JSONArray.fromObject("[{name:\"张三\";age:\12\";sex:\"男\"}]",  
  34.   
  35. jsonConfig  
  36. ); //编码后的json串   
  37. [java] view plaincopyprint?  
  38. JsonConfig jsonConfig = new JsonConfig();     
  39.     jsonConfig.registerJsonValueProcessor(String.class,    
  40.       new JsonValueProcessor(){    
  41.         public Object processArrayValue(Object value, JsonConfig jsonConfig) {    
  42.              return process(value);     
  43.         }    
  44.     
  45.         public Object processObjectValue(String key, Object value,     
  46.                 JsonConfig jsonConfig) {    
  47.             return process(value);    
  48.         }    
  49.             
  50.          /**   
  51.          * process   
  52.          * @param value   
  53.          * @return   
  54.          */     
  55.         public Object process(Object value) {     
  56.             try {     
  57.                 if (value instanceof String) {     
  58.                     
  59.                     return  URLEncoder.encode(value.toString(), "UTF-8");     
  60.                 }     
  61.                 return value == null ? "" : value.toString();     
  62.             } catch (Exception e) {     
  63.                 return "";     
  64.             }     
  65.     
  66.         }     
  67.     
  68.     });     
  69.         
  70.     JSONArray json = JSONArray.fromObject("[{name:\"张三\";age:\12\";sex:\"男\"}]",    
  71.                  
  72.             jsonConfig     
  73.     ); //编码后的json串    
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(String.class,
new JsonValueProcessor(){
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
}

public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
return process(value);
}

/**
* process
* @param value
* @return
*/
public Object process(Object value) {
try {
if (value instanceof String) {

return URLEncoder.encode(value.toString(),"UTF-8");
}
return value == null ?"" : value.toString();
} catch (Exception e) {
return "";
}

}

});

JSONArray json = JSONArray.fromObject("[{name:\"张三\";age:\12\";sex:\"男\"}]",

jsonConfig
); //编码后的json串
[java] view plaincopyprint?
JsonConfig jsonConfig = new JsonConfig();   
    jsonConfig.registerJsonValueProcessor(String.class,  
      new JsonValueProcessor(){  
        public Object processArrayValue(Object value, JsonConfig jsonConfig) {  
             return process(value);   
        }  
  
        public Object processObjectValue(String key, Object value,   
                JsonConfig jsonConfig) {  
            return process(value);  
        }  
          
         /**  
         * process  
         * @param value  
         * @return  
         */   
        public Object process(Object value) {   
            try {   
                if (value instanceof String) {   
                  
                    return  URLEncoder.encode(value.toString(), "UTF-8");   
                }   
                return value == null ? "" : value.toString();   
            } catch (Exception e) {   
                return "";   
            }   
  
        }   
  
    });   
      
    JSONArray json = JSONArray.fromObject("[{name:\"张三\";age:\12\";sex:\"男\"}]",  
               
            jsonConfig   
    ); //编码后的json串  

客户端使用函数decodeURI()再对json串中的value值进行两次解码即可。


在浏览器端使用XMLHttpRequest对象向服务器端传送中文参数,如果不在浏览器端和服务器端进行处理时,会出现中文乱码问题.针对这种问题,有很多的解决办法,但往往都是在IE下可以正常显示中文,在其他浏览器下(比如FireFox)却仍然是乱码.在FireFox下解决了乱码问题,但回到IE下访问却出现了乱码问题.所以针对要在目前流行的各种浏览器下解决中文乱码问题,才能使编写的Web程序变得通用.
针对这种问题的解决方案,我总结大致有两种:

一,在浏览器端对要传递的中文参数进行编码处理.代码如下:

xmlhttp.open("POST","AjaxServlet",true); //请求参数初始化

xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因为请求方式为POST,所以这里要设置请求头.(如果请求方式为GET,此句代码可以省略)
xmlhttp.send("name="+encodeURI(encodeURI("中国"))); //向服务器端发送参数


在服务器端代码:
PrintWriter out = response.getWriter(); //得到response的输出流对象

String name1 = request.getParameter("name"); //得到KEY为"name"的请求参数 
String name = URLDecoder.decode(name1,"utf-8"); //对得到的参数进行解码

out.print(name); //向浏览器端发送数据


二,在浏览器端对要传递的中文参数进行编码处理.代码如下:

xmlhttp.open("POST","AjaxServlet",true); //请求参数初始化

xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因为请求方式为POST,所以这里要设置请求头.(如果请求方式为GET,此句代码可以省略)

xmlhttp.send("name="+encodeURI("中国")); //向服务器端发送参数

在服务器端代码:

PrintWriter out = response.getWriter(); //得到response的输出流对象

String name1 = request.getParameter("name"); //得到KEY为"name"的请求参数 
String name = new String((name1.getBytes("ISO-8859-1")),"UTF-8"); //对得到的参数进行解码
out.print(name); //向浏览器端发送数据
以上两种方法,在使用XMLHttpRequest对象传递中文参数时,乱码问题可以在任意浏览器下解决,正确显示中文.

原文出处已经不记得了,希望作者能够见谅,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值