window.open("url?param="+paramvalue) 服务端 乱码问题解决

简介:

window.open("url?param="+paramvalue)传递参数出现乱码,在客房端显示是正常的,可是到服务端就是乱码。

  1. 利用一个js在客户端转码的函数,escape(str);但是传到服务端仍然是乱码,所以必须在服务端进行解码。

  2. 服务端执行request.setCharacterEncoding("utf-8");或GBK,这样传过来的参数就不用转码也是中文了。

1
客户端:<br>window.open( "WindowCustomerListAction?username=" +encodeURIComponent(form1.name.value),  "customerList" "width=550,height=250,scrollbars=yes,resizable=yes,status=yes" );

 3. 常用的编码&解码方式:

1
2
3
4
5
6
7
一、客户端:<br>      param=encodeURI(encodeURI(param));
       //说明:TOMCAT下一般通过两次encodeURI;WEBLOGIC下一般通过一次encodeURI
      window.open(url+param);
    服务端:<br>      String param=URLDecoder.decode(param, "UTF-8" );
二、客户端:param=encodeURI(param);
          window.open(url+param);
    服务端:String param= new  String(param.getBytes(  "iso-8859-1"  ),  "UTF-8"  );

 4. 附加两个比较专业的解释: 

1
2
3
4
5
6
1 . 服务器端(tomcat)是如何将数据获取到进行解码的:
    tomcat是先把数据用iso- 8859 - 1 进行解码.<br>   //对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态。
    //先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下有很多新手说用request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:
     //Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().
     //可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因:
     //是在客户端一般都是用UTF-8或GBK对数据URLencode,这里用iso-8859-1方式URL decoder显然不行的.
1
2
3
4
5
6
7
8
9
2 .  在客户端进行uriencode的必要性:
     对于get方法来说,都是把数据串联在请求的url后面作为参数,
如:http: //localhost:8080/servlet?msg=abc
(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http: //localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。
     我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了URL encode的过程,我们能看到 2 个很重要的问题
     //第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;
     //第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。
     完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso- 8859 - 1 的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso- 8859 - 1 编码方式编码成二进制的 101010 .....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso- 8859 - 1 编码会丢失信息。
    //所以先做URL encode是有必要的。

  

 

 本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/3617904.html,如需转载请自行联系原作者

相关文章
|
18天前
|
JavaScript
vue截取URL中的参数
vue截取URL中的参数
13 0
|
2月前
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
19 0
|
2月前
BurpSuite8.2 -- 查找包含id参数的URL
BurpSuite8.2 -- 查找包含id参数的URL
19 1
|
2月前
|
分布式计算 DataWorks 关系型数据库
DataWorks数据源问题之参数“连接Url”如何解决
DataWorks数据源是指DataWorks中配置的用于数据集成的外部数据源;本合集将讲解如何在DataWorks中配置和管理数据源,以及处理数据源连接和集成过程中的问题。
29 5
|
3月前
Copy网页中F12里的请求url到postman,并且把所有参数都带过来
Copy网页中F12里的请求url到postman,并且把所有参数都带过来
29 0
|
3月前
|
JavaScript
如何在JS中实现修改URL参数而不刷新页面
如何在JS中实现修改URL参数而不刷新页面
61 1
|
2月前
feign使用url参数传参@SpringQueryMap使用
feign使用url参数传参@SpringQueryMap使用
32 0
|
4月前
|
JavaScript
如何在JS中实现修改URL参数而不刷新页面
如何在JS中实现修改URL参数而不刷新页面
|
17天前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
17天前
|
JavaScript
【归总】原生js操作浏览器hash、url参数参数获取/修改方法合集
【归总】原生js操作浏览器hash、url参数参数获取/修改方法合集

热门文章

最新文章