地址传值中文乱码

 

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

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

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

 

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

 

  让jsp正确解释含有中文的URL以及传递中文参数是一个很有用的特性,也是比较复杂的。我去年的一个小项目中就碰到了在URL中传递中文参数的问题,但是当时由于对Jsp还不是很熟悉,所以没有解决这个问题因而舍弃了一部分功能。
  
  但是,这个问题确实得解决,因为在即将展开的一个项目中肯定得用它。于是,今天花了一天的时间来研究这个问题,好在功夫不负有心人,现在问题终于解决了。下面就做一下介绍:
  
  IEFirefoxOpera三种浏览器对URL的传输的处理各不相同,浏览器在传输URl时得对URL进行编码,IE默认是以UTF-8来传输的,Opera可能也是以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")对中文参数进行编码,这样不管各浏览器怎样对中文参数进行处理,此时经过我们编码后的中文对浏览器来说就是字节码,与abc等字母没有什么区别。但是服务器会用UTF-8编码形式来还原中文参数。
  
  总结一下:以Tomcat服务器为例,在中添加URIEncoding="UTF-8",设置tomcatutf-8的编码方式来处理URL。其次,对URL中的中文和中文参数都用URLEncoder.encode("中文","UTF-8")进行编码。

 

 

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

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

问题代码:

Java代码  

<a href="member!sysLogin.do?name='${member.uname }'" target="_blank" />登录</a>   

  超链接形式的传参,都是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代码  

<a href="javascript:toSysLogin('${member.uname }');"  />登录</a>  

  

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("登录失败");  

              

        }catch(RuntimeException e){  

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

        } catch (UnsupportedEncodingException e) {  

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

        }  

        return this.MESSAGE;  

    }  

 问题解决!

encode编码

decode解码

 

 

这里有个全的。。

 

JAVA URL链接中文参数乱码的若干处理方法,现在整理收录如下

方法一: 

http://xxx.do?ptname='我是中国人

String strPtname = request.getParameter("ptname"); 

strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");   

方法二: 

<%@ page contentType="text/html;charset=gb2312" %> 

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>">点击这里</a> 

<% 

//request.setCharacterEncoding("GBK"); 

if(request.getParameter("url")!=null) 



str=request.getParameter("url"); 

str=java.net.URLDecoder.decode(str,"GB2312"); 

str=new String(str.getBytes("ISO-8859-1")); 

out.print(str); 



%> 

================================== 

public String chinatoString(String str) 

     { 

      String s=str; 

      try 

      { 

       byte tempB[]=s.getBytes("ISO-8859-1"); 

       s=new String(tempB); 

       return s; 

      } 

      catch(Exception e) 

      { 

       return s; 

      } 

    } 

==================================================== 

function URLencode(sStr) 

    { 

      return escape(sStr). 

               replace(/\+/g, '%2B'). 

                  replace(/\"/g,'%22'). 

                     replace(/\'/g, '%27'). 

                       replace(/\//g,'%2F'); 

    } 

方法三: 

如果用jstl的话,可以自己写一个elfunction,调用URLEncoder.encode来编码。 

IE缺省对URL后面的参数是不编码发送的,但是tomat缺省是按ISO8859-1来进行URL解码,因此才会出现上述错误。好的做法是: 

1、在URL参数中确保用UTF-8编码之,方法可以用js函数encodeURI(),或调用自定义的el function; 

2、设置server.xml中的Connector熟悉URIEncoding="UTF-8",确保解码格式与编码格式统一; 

方法四: 

<script> 

for(var i=0;i<document.links.length;i++){ 

document.links[i].href=encodeURI(document.links[i].href); 



</script> 

action中,String s=request.getParameter("s"); 

s=new String(s.getBytes("iso-8859-1"),"gbk"); 

以上方法是收聚了一些网友所讲的解决方法 。 

 

本文抄录网络博客

本菜主使用方法:

var ch = "中文";
ch = encodeURI(ch);
ch = encodeURI(ch);
$.ajax({url:'userManager.do?ch='+ch,....});
接收
String ch=URLDecoder.decode(request.getParameter("ch"),"utf-8");
### 前端 URL 乱码解决方案 在前端开发中,URL 参数中文字符时可能会出现乱码问题。以下是针对该问题的详细解决方案。 #### 1. 使用 JavaScript 对 URL 参数进行编码 当通过 URL 递参数时,如果参数包含中文或其他非 ASCII 字符,可以使用 `encodeURI()` 或 `encodeURIComponent()` 函数对参数进行编码[^2]。 ```javascript var user_name = "张三"; var url = 'web/comm?user_name=' + encodeURIComponent(user_name); ``` 上述代码中,`encodeURIComponent()` 用于对 `user_name` 进行编码,确保其能够正确地作为 URL 参数递[^2]。 #### 2. 前端对 URL 参数进行两次编码 在某些情况下,可能需要对 URL 参数进行两次编码。例如,当参数需要经过多次解析或中间层处理时,一次编码可能不足以避免乱码问题。 ```javascript var user_name = "张三"; var url = 'web/comm?user_name=' + encodeURI(encodeURI(user_name)); ``` 后端接收到参数后,需要对其进行解码操作。以下是一个 Java 示例: ```java if (values.isNotEmpty("user_name")) { String user_name = values.getStr("user_name"); try { user_name = URLDecoder.decode(user_name, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } values.add("user_name", user_name); } ``` 上述代码中,`URLDecoder.decode()` 函数将参数从 UTF-8 编码格式解码为原始字符串[^1]。 #### 3. 确保前后端编码一致 为了避免乱码问题,确保前后端使用的编码格式一致,通常推荐使用 UTF-8。此外,还需确保服务器端能够正确处理请求数据。 以 Java Servlet 为例,可以通过以下代码设置请求和响应的字符编码: ```java request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); ``` 上述代码确保了请求和响应均使用 UTF-8 编码,从而避免乱码问题。 #### 4. 配置 Tomcat 容器解决 GET 请求乱码 如果在使用 Tomcat 容器时,GET 请求仍然出现乱码问题,可能是由于 Tomcat 默认未正确配置 URI 编码。可以在 `server.xml` 文件中添加以下配置: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> ``` 上述配置确保 Tomcat 容器在处理 URI 时使用 UTF-8 编码[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值