在向腾讯批量提交数据时,发现有时有的数据签名失败,后来检查后发现凡是提交失败的那条数据,其签名字符串都含有 “+” 号。并没有做 urlencode 直接放在了 querystring 里面传了过去,致使接收方无法获得正常的参数。
用URL传参数的时候,如果某一个参数中含" #$ ^ & * + = "这些符号的时候,在另一个页面或接收方就会取不到传过来的参数。
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,需要对其进行URL编码
- + URL中+号表示空格 %2B
- 空格 URL中的空格可以用+号或者编码 %20
- / 分隔目录和子目录 %2F
- ? 分隔实际的 URL 和参数 %3F
- % 指定特殊字符 %25
- # 表示书签 %23
- & URL中指定的参数间的分隔符 %26
- = URL中指定参数的值 %3D
C#
C#中编码的主要方法:HttpUtility.UrlEncode(不推荐)、Server.UrlEncode(不推荐)、Uri.EscapeUriString、Uri.EscapeDataString。
Java
采用 URLEncoder.encode(param,"utf-8") 将参数值编码,对应的解码方法为URLEncoder.decode()
java.net.URLEncoder.encode(String s) 和 java.net.URLDecoder.decode(String s)
javascript
javascript中的编码有三种方法:escape(不推荐,对ASCII符号正确编码)、encodeURI、encodeURIComponent
encodeURI:用于对网址编码(不包含参数)
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURI就是为这个而设计的。encodeURI不对URI中的特殊字符进行编码,如冒号(:)、斜杠(/)。下面看个示例:
encodeURI("http://www.youkuaiyun.com/a file with spaces.html")
// outputs http://www.youkuaiyun.com/a%20file%20with%20spaces.html
可以看到仅仅把空格替换成了20%,所以此方法可用于对网址进行编码。
由于encodeURI不对冒号(:)、斜杠(/)进行编码,所以如果参数(如把网址作为参数)中包含冒号(:)、斜杠(/),就会解析出错,所以此方法不能对参数进行编码。
encodeURIComponent:用于对网址参数进行编码
encodeURIComponent 不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
可以看到此方法对:/都进行了编码,所以不能用它来对网址进行编码。由于此方法对中文,空格,井号(#),斜线(/),冒号(:)都进行了编码,所以适合对URI中的参数进行编码。看下面的示例:
var url="http://www.youkuaiyun.com/?key="+encodeURIComponent(param)+"&page=1";
//outputs http://www.youkuaiyun.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1