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