在网址中转义特殊字符

时间:2012-05-27 06:19:32

标签: javascript url special-characters

我正在使用网址打开一个html页面,我正在使用页面网址以查询字符串形式发送数据。

例如:abc.html?firstParameter=firstvalue&seconedParameter=seconedvalue

问题是如果参数中包含firstvaluesecondvalue#,(,),%,{这样的特殊字符,那么我的网址构建效果不佳。在这种情况下,url无法验证。 我在javascript做了这一切。 任何人都可以帮我解决这个问题。

2 个答案:

答案 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