您的位置:首页 > 其它

url 中文传参 乱码问题

2014-01-03 16:17 260 查看
(转自:http://blog.csdn.net/yiyuhanmeng/article/details/7548505)

开发一直用firfox网页,调试什么的都很方便。所以遇到了浏览器之间的兼容问题。url中文传参。

问题:前台用url传值中文,后台用request.getParameter接收参数。

      
用firfox,chrome等没有问题。用ie会出现接参乱码现象。

 

上网查了一下,算了,还是把原文帖上来吧。比较容易懂。

 

  让jsp正确解释含有中文的URL以及传递中文参数是一个很有用的特性,也是比较复杂的。我去年的一个小项目中就碰到了在URL中传递中文参数的问题,但是当时由于对Jsp还不是很熟悉,所以没有解决这个问题因而舍弃了一部分功能。

  

  但是,这个问题确实得解决,因为在即将展开的一个项目中肯定得用它。于是,今天花了一天的时间来研究这个问题,好在功夫不负有心人,现在问题终于解决了。下面就做一下介绍:

  

  IE、Firefox、Opera三种浏览器对URL的传输的处理各不相同,浏览器在传输URl时得对URL进行编码,IE默认是以UTF-8来传输的,Opera可
4000
能也是以UTF-8编码的,Firefox经过测试肯定不是以UTF-8来编码的,有可能是以ISO-8859-1来编码的。所以如果不对中文进行处理,那么中文字符经各个浏览器以自己的编码方式传输到服务器后就出现了各种编码方式,而服务器却只能以一种编码方式来对接收到的URL进行解码。这样的话,和服务器使用的编码方式一样的浏览器在使用带中文的URl时不会出现问题,其他的浏览器则会出现问题。

  

  所以解决的办法就是在URL进行传输之前对其中的中文进行编码,使用的编码是和服务器一样的编码,假设服务器使用的编码是UTF-8,则编码语句如下:URLEncoder.encode("中文","UTF-8")。这样对中文进行编码后所有的浏览器都不会再用他们默认的编码方式对中文进行编码,因为此时浏览器看到的已经不是中文了,而是编码后的字节码。这样就避开了浏览器传输URL时编码的差异性问题。

  

  对中文参数问题的解决方式和上面一样。但这里所指的中文参数是指以?name="中文参数"方式附在URL后,以get方法传输到服务器的这种形式,并不是以表单形式提交到服务器的。各浏览器对中文参数的处理方式和各自对URL中中文的处理方式都不相同,各浏览器之间也有差异,有的在传输之前不进行编码,有的在传输之前就已经进行了编码,情形非常复杂。

  

  但是我们以不变应万变,都用URLEncoder.encode("中文","UTF-8")对中文参数进行编码,这样不管各浏览器怎样对中文参数进行处理,此时经过我们编码后的中文对浏览器来说就是字节码,与a、b、c等字母没有什么区别。但是服务器会用UTF-8编码形式来还原中文参数。

  

  总结一下:以Tomcat服务器为例,在中添加URIEncoding="UTF-8",设置tomcat以utf-8的编码方式来处理URL。其次,对URL中的中文和中文参数都用URLEncoder.encode("中文","UTF-8")进行编码。

 

 

再有,就是在后台进行转码。

点击后打开新页面,用户登录!用户名为中文时,火狐、google浏览器无问题,但IE有乱码问题:

问题代码:

Java代码 
登录  

  超链接形式的传参,都是Get方式!

Java代码 

public String sysLogin(){ 

   
try{ 

       
name=new
String(name.getBytes("iso-8859-1"),"utf-8"); 

       
int r  =
this.memberManager.loginbysys(name); 

       
if(r==1){ 

           
return "syslogin"; 

       


       
this.msgs.add("登录失败"); 

         

   
}catch(RuntimeException e){ 

       
this.msgs.add(e.getMessage());           

    } catch
(UnsupportedEncodingException e) { 

       
this.msgs.add(e.getMessage());           

   


    return
this.MESSAGE; 



 修改成功:

Java代码 

登录 

 

function toSysLogin(name){ 

    var
uriname="member!sysLogin.do?name="+name; 

    window.open(
encodeURI(uriname)); 



 

Java代码 

public String sysLogin(){ 

       
try{ 

           
this.setName(java.net.URLDecoder.decode(name, "UTF-8"));//
此处转码 

           
name=new
String(name.getBytes("iso-8859-1"),"utf-8"); 

           
int r  =
this.memberManager.loginbysys(name); 

           
if(r==1){ 

               
return "syslogin"; 

           


           
this.msgs.add("登录失败"); 

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: