接手别人的代码,做些bug修改和二次开发,今天发现了一个问题,前台Ajax请求的时候有个参数带有+号,传到后台查不到数据,调试发现+号后台被解码为空格,
发送:key=escape('abc+def'); 实际发送:key=abc+def
接收:context.Request["key"]; 实际接收: abc def
+号在解码的时候被翻译成了空格,也就是前台没有对+号正确的编码,经查询发现:
escape不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
接下来查找解决办法:
1、选择其他的编码函数。
javascript主要的编码方式有escape、encodeURI、encodeURIComponent。其中:
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函数替换escape,问题解决。
2、使用replace函数手动替换+号为%2B
看到有人说因为某些原因无法使用encodeURIComponent函数,这时可以用escape('abc+def').replace('+','%2B')来处理,如果遇到其他需要替换的字符,可以参考下面的列表
空格 - %20
" - %22
# - %23
% - %25
& - %26
( - %28
) - %29
+ - %2B
, - %2C
/ - %2F
: - %3A
; - %3B
< - %3C
= - %3D
> - %3E
? - %3F
@ - %40
\ - %5C
| - %7C