欢迎来到天天文库
浏览记录
ID:30779194
大小:89.25 KB
页数:7页
时间:2019-01-03
《java中文乱码解决之道(8):解决url中文乱码问题-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、java中文乱码解决Z道(8):解决URL中文乱码问题-编程开发技术java中文乱码解决之道(8):解决URL中文乱码问题原文出处:chenssy我们主要通过两种形式捉交向服务器发送请求:URL、表单。而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面。通过前面儿篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。如果程序员要把每一种结杲都考虑进去,是不是太恐怖了?有没有办法,能够保证客户端只用一种编
2、码方法向服务器发岀请求?有!这里我主要提供以下儿种方法—、javascript使用javascript编码不给浏览器插手的机会,编码Z后再向服务器发送请求,然后在服务器屮解码。在掌握该方法的时候,我们需要料及javascript编码的三个方法:escape()、encodeURI()、encodeURIComponent()。escape采用SIOLatin字符集对指定的字符吊进行编码。所有非ASCII字符都会被编码%%xx格式的字符串,英屮xx表示该字符在字符集屮所对应的16进制数字。例如,格式对应
3、的编码为%20。它对应的解码方法为unescape()o事实上escape()不能直接用于URL编码,它的真止作用是返回一个字符的Unicode编码值。比如上面“我是cm”的结果为%u621l%u662Fcm,其中“我”对应的编码为6211,“是”的编码为662F,“cm”编码为cm。注意,escape()不对”+”编码。但是我们知道,网页在捉交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的吋候要小心。encocleURI对整个URL进行编码,它采用
4、的是UTF-8格式输出编码后的字符串。不过encodeURl除了ASCII编码外对于一些特殊的字符也不会进行编码如@#$&*()=:/;?+encodeURIComponent()把URT字符串采用UTF-8编码格式转化成escape格式的字符串。相对于encodeURl,encodeURIComponent会更加强大,它会对那些在encodeURl()中不被编码的符号(;/?:@&二+$,#)统统会被编码。但是encodeURIComponent只会对URL的组成部分进行个别编码,而不用于对整个UR
5、L进行编码。对应解码函数方法decodeURIComponento当然我们一般都是使用encodeURl方來进彳亍编码操作。所谓的javascript两次编码后台两次解码就是使用该方法。javascript解决该问题有一次转码、两次转码两种解决方法。一次转码javascript转码:varurl=J/ShowMoblieQRCode.servlet?name=我是cm';window,location,href=encodeURl(url);转码
6、后的URL:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%E6%88%91%E6%98%AFcm后台处理:Stringname=request.getParameter(,zname,z);System,out.printin(,z前台传入参数:〃+name);name=newString(name.getBytes("ISO-8859T"),"UTF-8");System,out.printin(,z经过解码后参数:〃+na
7、me);输出结果:前台传入参数:经过解码后参数:我是cm二次转码javascriptvarurl二'〈s:propertyvalue二〃webPath"/>/ShowMob1icQRCodc.scrvlct?namc=我是cm';window.1ocation.href=encodeURl(encodeURl(url));转码后的url:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%25E6%2588%2591%25E6%25
8、98%25AFcm后台处理:Stringname=request・getParameter("name");System,out.printin(,z前台传入参数:"+name);name二URLDecoder.decode(name,〃UTF-8〃);System,out.println(z,经过解码后参数:〃+name);输出结杲:前台传入参数:E68891E698AFcm经过解码后参数:我是cm"Iter使用过滤器,过滤器LZ提供两种,第一•种设置
此文档下载收益归作者所有