在Javascript中二次使用encodeURIComponent对目标字符进行编码处理,使其成为符合要求的编码格式。
encodeURIComponent(encodeURIComponent('中文#@$^&*=-+_'));
使用encodeURIComponent,而不是encodeURI是为了根据需求解决特殊字符无法转码的问题。
(escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z)
为什么要二次使用encodeURIComponent呢?
因为服务器端tomcat会在你做解码之前自动先对URL做一次decode解码,所以客户端要编码两次,服务器端只解码一次就OK了。
如果只使用一次encodeURIComponent,会怎样呢?
如果只使用一次encodeURIComponent编码的话,则传递到Servlet的就是已经处理过的中文字符,而不是纯粹的ASCII字符
(此处应该是%E4%B8%AD%E6%96%87%23%40%24%5E%26*%3D-%2B_),自然而然,此时再进行
java.net.URLDecoder.decode("中文#@$^&*=-+_","utf-8");就不会得到正确的结果。
例子2:
首先,如果是在js端的代码,用window.href进行请求时,需要进行转码
前台jsp中:
var param = document.getElementById('param').value;
param = encodeURI(encodeURI(param));//注意,是两次转码,我就被这个坑过
后台java类中:
String param = request.getParameter("param")
groupBuyerName=URLDecoder.decode(param,"utf-8");
这样,param就被转换成了utf-8的码了,而且当直接从url上进行输入的时候,同样也能转码
例子3:
在接受get传参过来的值的时候,如果get传参的值有中文的话,
比如::
那么在接收这个参数的时候,必须给这个中文解码(因为有些浏览器会默认给中文编码,上一个页面可以没有urlencode,用urlencode只是想改变浏览器解析一些特殊字符的情况,而这个时候我们不需要改变,所以不需要urlencode)
$name=urldecode($_GET['name']);
原文链接1:https://blog.csdn.net/u011066648/article/details/37657859