我正在使用网址打开一个html页面,我正在使用页面网址以查询字符串形式发送数据。
例如:abc.html?firstParameter=firstvalue&seconedParameter=seconedvalue
问题是如果参数中包含firstvalue
或secondvalue
像#,(,),%,{
这样的特殊字符,那么我的网址构建效果不佳。在这种情况下,url无法验证。
我在javascript
做了这一切。
任何人都可以帮我解决这个问题。
答案 0 :(得分:17)
您有3个选项:
escape() will not encode: @*/+
encodeURI() will not encode: ~!@#$&*()=:/,;?+'
encodeURIComponent() will not encode: ~!*()'
但是在你的情况下,如果你想将url传递给其他页面的GET参数,你应该使用escape或encodeURIComponent,但不能使用encodeURI。
答案 1 :(得分:4)
为了安全并确保您已经转义了RFC 1738和RFC 3986中指定的所有保留字符,您应该使用encodeURIComponent,escape和替换星号('*')的组合,如下所示:
encoded = encodeURIComponent( parm ).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
[说明] 虽然RFC 1738:统一资源定位符(URL)指定*,!,',(和)字符可能在URL中未编码,
因此,只有字母数字,特殊字符“$ -_。+!*'(),”和 可以使用用于其保留目的的保留字符 在URL中未编码。
RFC 3986,第12-13页,声明这些特殊字符保留为子分隔符。
reserved = gen-delims / sub-delims
gen-delims =“:”/“/”/“?” /“#”/“[”/“]”/“@”
sub-delims =“!” /“$”/“&” /“'”/“(”/“)” /“*”/“+”/“,”/“;” /“=”
不推荐使用escape()函数,但可以使用它对感叹号,单引号,左括号和右括号进行URL编码。由于对星号是否必须在URL中进行编码存在一些模糊性,并且编码没有损害,因此您可以使用类似于replace()函数调用的方式进行显式编码。 [注意,escape()函数作为second parameter to the first replace() function call传递。这里使用的替换为每个匹配的特殊字符!,',(或)调用escape()函数一次,而escape只返回该字符的'转义序列'回来替换,它重新组合任何转义的字符与另一个片段。]
另见'https://stackoverflow.com/questions/6533561/urlencode-the-asterisk-star-character'
虽然有些网站甚至将asterkisk(*)标识为RFC3986下的保留字符,但它们不会将其包含在their URL component encoding tool中。
未编码的网址参数:
parm1=this is a test of encoding !@#$%^&*()'
parm2=note that * is not encoded
编码的网址参数:
parm1=this+is+a+test+of+encoding+%21%40%23%24%25%5E%26*%28%29%27
parm2=note+that+*+is+not+encodeds+not+encoded