本文转自:http://www.jb51.cc/article/p-dyxzzgqf-ber.html貌似这哥们也是转的。不管了,嘿嘿学习为目的。
AJAX传值时采用的是UTF-8编码格式,客户端中文字符传输到服务器端时,如果服务器编码格式或者所采用的MVC框架的编码格式不是UTF-8,则很可能会出现中文乱码。解决办法如下:
客户端用js函数encodeURI()对中文字符进行两次编码,服务器端采用URLDecoder类对客户端传输过来的中文字符进行UTF-8格式的解码。示例:
- $.ajax({
- type:"post",
- url:"createNewGroup.action",
- data:"name="+encodeURI(encodeURI("张三")),
- success:function(msg){
- alert(msg);
- }
- });
$.ajax({ type: "post",url: "createNewGroup.action",data:"name="+encodeURI(encodeURI("张三")),success: function(msg){ alert(msg); } });服务器端代码:
- Stringname=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进行单独编码。
示例代码:
- JsonConfigjsonConfig=newJsonConfig();
- jsonConfig.registerJsonValueProcessor(String.class,
- newJsonValueProcessor(){
- publicObjectprocessArrayValue(Objectvalue,JsonConfigjsonConfig){
- returnprocess(value);
- }
- publicObjectprocessObjectValue(Stringkey,Objectvalue,
- JsonConfigjsonConfig){
- returnprocess(value);
- }
- /**
- *process
- *@paramvalue
- *@return
- */
- publicObjectprocess(Objectvalue){
- try{
- if(valueinstanceofString){
- returnURLEncoder.encode(value.toString(),"UTF-8");
- }
- returnvalue==null?"":value.toString();
- }catch(Exceptione){
- return"";
- }
- }
- });
- JSONArrayjson=JSONArray.fromObject("[{name:\"张三\";age:\12\";sex:\"男\"}]",
- jsonConfig
- );//编码后的json串
- [java]viewplaincopyprint?
- JsonConfigjsonConfig=newJsonConfig();
- jsonConfig.registerJsonValueProcessor(String.class,
- newJsonValueProcessor(){
- publicObjectprocessArrayValue(Objectvalue,JsonConfigjsonConfig){
- returnprocess(value);
- }
- publicObjectprocessObjectValue(Stringkey,
- JsonConfigjsonConfig){
- returnprocess(value);
- }
- /**
- *process
- *@paramvalue
- *@return
- */
- publicObjectprocess(Objectvalue){
- try{
- if(valueinstanceofString){
- returnURLEncoder.encode(value.toString(),"UTF-8");
- }
- returnvalue==null?"":value.toString();
- }catch(Exceptione){
- return"";
- }
- }
- });
- JSONArrayjson=JSONArray.fromObject("[{name:\"张三\";age:\12\";sex:\"男\"}]",
- jsonConfig
- );//编码后的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,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值进行两次解码即可。
针对这种问题的解决方案,我总结大致有两种:
一,在浏览器端对要传递的中文参数进行编码处理.代码如下:
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); //向浏览器端发送数据
二,43); font-size:14px"> xmlhttp.send("name="+encodeURI("中国")); //向服务器端发送参数
String name = new String((name1.getBytes("ISO-8859-1")),"UTF-8"); //对得到的参数进行解码
以上两种方法,在使用XMLHttpRequest对象传递中文参数时,乱码问题可以在任意浏览器下解决,正确显示中文.
原文出处已经不记得了,希望作者能够见谅,
原文链接:https://www.f2er.com/ajax/164736.html