@H_502_2@1.@H_502_2@@H_502_2@发送路径中的参数有中文,在服务器段接收参数值是乱码@H_502_2@
@H_502_2@@H_502_2@解决办法:前端@H_502_2@(@H_502_2@@H_502_2@客户端@H_502_2@)@H_502_2@@H_502_2@两次编码,后端@H_502_2@(@H_502_2@@H_502_2@服务器@H_502_2@)@H_502_2@@H_502_2@一次解码!@H_502_2@
@H_502_2@@H_502_2@前端:@H_502_2@
@H_502_2@var url="index.jsp?test=@H_502_2@@H_502_2@@H_502_2@@H_502_2@来自前台我不是乱码@H_502_2@"@H_502_2@@H_502_2@;@H_502_2@
@H_502_2@url=encodeURI(url);
@H_502_2@url=encodeURI(url); //@H_502_2@@H_502_2@两次编码@H_502_2@
@H_502_2@XMLHTTP.open ("post",url,true);
@H_502_2@@H_502_2@后端:@H_502_2@
@H_502_2@String name = arg0.getParameter("test");
@H_502_2@name = java.net.URLDecoder.decode(name,"UTF-8");//@H_502_2@@H_502_2@一次解码@H_502_2@
@H_502_2@System.out.println("@H_502_2@@H_502_2@前台传过来的参数:@H_502_2@" + name);//@H_502_2@@H_502_2@输出结果:来自前台我不是乱码@H_502_2@
@H_502_2@
@H_502_2@2.@H_502_2@@H_502_2@返回来的@H_502_2@responseText@H_502_2@@H_502_2@或@H_502_2@responseXML@H_502_2@@H_502_2@的值中含有中文是乱码@H_502_2@
@H_502_2@@H_502_2@解决办法:在后端指定发送数据的格式!@H_502_2@
@H_502_2@@H_502_2@后端:@H_502_2@
@H_502_2@response.setContentType("text/xml;charset=UTF-8"); //@H_502_2@@H_502_2@这行放在流输出前才好使@H_502_2@
@H_502_2@PrintWriter out = arg1.getWriter();
@H_502_2@String info = "@H_502_2@@H_502_2@来自后台我不是乱码@H_502_2@";
@H_502_2@out.println(info);
@H_502_2@@H_502_2@前端:@H_502_2@
@H_502_2@var backInfo = XMLHttpReq.responseText;//@H_502_2@@H_502_2@后台返回的信息@H_502_2@
@H_502_2@alert(backInfo);//@H_502_2@@H_502_2@结果:来自后台我不是乱码@H_502_2@
@H_502_2@
@H_502_2@3.@H_502_2@@H_502_2@总结@H_502_2@
@H_502_2@1) Ajax@H_502_2@@H_502_2@提交数据的格式默认为@H_502_2@utf-8,@H_502_2@@H_502_2@利用@H_502_2@javascript@H_502_2@@H_502_2@的提供的@H_502_2@encodeURI()@H_502_2@@H_502_2@方法两次编码@H_502_2@.@H_502_2@@H_502_2@在服务器端接收的时候要使用@H_502_2@java.net.URLDecoder.decode("","UTF-8")@H_502_2@@H_502_2@方法解码一次@H_502_2@.
@H_502_2@2) AJAX@H_502_2@@H_502_2@在接收@H_502_2@responseText@H_502_2@@H_502_2@或@H_502_2@responseXML@H_502_2@@H_502_2@的值的时候是按照@H_502_2@UTF-8@H_502_2@@H_502_2@的格式来解码的@H_502_2@,@H_502_2@@H_502_2@所以服务器要向客户端发送数据的时候@H_502_2@,@H_502_2@@H_502_2@也要采用@H_502_2@utf-8@H_502_2@@H_502_2@编码@H_502_2@,response.setContentType("text/xml;charset=UTF-8").
@H_502_2@3)@H_502_2@@H_502_2@如果上述方法仍然解决不了乱码问题@H_502_2@,@H_502_2@@H_502_2@那你尝试一下把@H_502_2@jsp,htm,java@H_502_2@@H_502_2@文件用@H_502_2@UTF-8@H_502_2@@H_502_2@编码格式保存@H_502_2@.@H_502_2@@H_502_2@总之,前后台数据交互都采用@H_502_2@utf-8@H_502_2@@H_502_2@编码就行了@H_502_2@.
@H_502_2@
@H_502_2@4.@H_502_2@@H_502_2@对转码用的一些方法的解释@H_502_2@
@H_502_2@1)Js@H_502_2@@H_502_2@方法@H_502_2@encodeURI
@H_502_2@@H_502_2@代码如下@H_502_2@:
@H_502_2@var uri="my test.asp?name=stale&car=saab";
@H_502_2@document.write(encodeURI(uri));
@H_502_2@@H_502_2@上面的输出如下:@H_502_2@
@H_502_2@my%20test.asp?name=st%C3%A5le&car=saab
@H_502_2@
@H_502_2@2) Js@H_502_2@@H_502_2@方法@H_502_2@encodeURIComponent
@H_502_2@@H_502_2@代码如下@H_502_2@:
@H_502_2@var uri="http://jb51.net/my test.asp?name=stale&car=saab";
@H_502_2@document.write(encodeURIComponent(uri));
@H_502_2@@H_502_2@上面的输出如下:@H_502_2@
@H_502_2@http%3A%2F%2Fjb51.net%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab
@H_502_2@
@H_502_2@3)java@H_502_2@@H_502_2@方法@H_502_2@
@H_502_2@java.net.URLDecoder
@H_502_2@public static String decode(String s,String enc) throws UnsupportedEncodingException
@H_502_2@@H_502_2@使用指定的编码机制对@H_502_2@ application/x-www-form-urlencoded @H_502_2@@H_502_2@字符串解码。给定的编码用于确定任何@H_502_2@ "%xy" @H_502_2@@H_502_2@格式的连续序列表示的字符。@H_502_2@
@H_502_2@@H_502_2@注:@H_502_2@World Wide Web Consortium Recommendation @H_502_2@@H_502_2@声明应使用@H_502_2@ UTF-8@H_502_2@@H_502_2@。如果不使用该编码,可能造成不兼容性。@H_502_2@
@H_502_2@4)java@H_502_2@@H_502_2@方法@H_502_2@
@H_502_2@java.net.URLEncoder
@H_502_2@public static String encode(String s,String enc) throws UnsupportedEncodingException
@H_502_2@@H_502_2@使用指定的编码机制将字符串转换为@H_502_2@ application/x-www-form-urlencoded @H_502_2@@H_502_2@格式。该方法使用提供的编码机制获取不安全字符的字节。@H_502_2@
@H_502_2@@H_502_2@注:@H_502_2@World Wide Web Consortium Recommendation @H_502_2@@H_502_2@声明应使用@H_502_2@ UTF-8@H_502_2@@H_502_2@。如果不使用该编码,可能造成不兼容性。@H_502_2@
@H_502_2@5)
@H_502_2@1.request.setCharacterEncoding("GBK")@H_502_2@@H_502_2@是设置从@H_502_2@request@H_502_2@@H_502_2@中取得的值或从数据库中取出的值@H_502_2@response.setContentType("text/html;charset=GBK")@H_502_2@@H_502_2@是设置页面中为中文编码前者是设置动态文字(参数,数据库),后者设置页面静态文字@H_502_2@.
@H_502_2@2.response.setContentType@H_502_2@@H_502_2@指定@H_502_2@ HTTP @H_502_2@@H_502_2@响应的编码@H_502_2@,@H_502_2@@H_502_2@同时指定了浏览器显示的编码@H_502_2@,@H_502_2@@H_502_2@调用此方法@H_502_2@,@H_502_2@@H_502_2@必须在@H_502_2@getWriter@H_502_2@@H_502_2@执行之前或者@H_502_2@response@H_502_2@@H_502_2@被提交之前@H_502_2@.
@H_502_2@3.response.setCharacterEncoding("GBK")@H_502_2@@H_502_2@设置@H_502_2@HTTP @H_502_2@@H_502_2@响应的编码@H_502_2@,@H_502_2@@H_502_2@如果之前使用@H_502_2@response.setContentType@H_502_2@@H_502_2@设置了编码格式@H_502_2@,@H_502_2@@H_502_2@则使用@H_502_2@response.setCharacterEncoding@H_502_2@@H_502_2@指定的编码格式覆盖之前的设置@H_502_2@; response.setCharacterEncoding@H_502_2@@H_502_2@与@H_502_2@response.setContentType@H_502_2@@H_502_2@相同的是@H_502_2@,@H_502_2@@H_502_2@必须在@H_502_2@getWriter@H_502_2@@H_502_2@执行之前或者@H_502_2@response@H_502_2@@H_502_2@被提交之前@H_502_2@.