8

我正在使用 url 打开一个 html 页面,并且我正在使用页面 url 在查询字符串中发送数据。

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

问题是如果firstvalueor secondvaluein 参数包含特殊字符#,(,),%,{,那么我的 url 构造不好。在这种情况下 url 没有验证。我正在做这一切javascript。任何人都可以帮我解决这个问题。

4

2 回答 2

19

您有 3 个选项:

escape() will not encode: @*/+

encodeURI() will not encode: ~!@#$&*()=:/,;?+'

encodeURIComponent() will not encode: ~!*()'

但是在您的情况下,如果您想将 url 传递给其他页面的 GET 参数,您应该使用 escape 或 encodeURIComponent,而不是 encodeURI。

于 2012-05-27T06:23:17.690 回答
7

为了安全起见并确保您已经转义了 RFC 1738 和 RFC 3986 中指定的所有保留字符,您应该使用 encodeURIComponent、转义和替换星号('*')的组合,如下所示:

encoded = encodeURIComponent( parm ).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");

[说明] 虽然 RFC 1738: Uniform Resource Locators (URL) 指定 *、!、'、( 和 ) 字符可以在 URL 中未编码,

因此,只有字母数字、特殊字符“$-_.+!*'()”和用于其保留目的的保留字符可以在 URL 中未编码地使用。

RFC 3986,第 12-13 页,声明这些特殊字符被保留为子分隔符。

保留= gen-delims / sub-delims

gen-delims = ":" / "/" / "?" /“#”/“[”/“]”/“@”

子分隔符=“!” /“$”/“&”/“'”/“(”/“)”/“*”/“+”/“”/“;” /“=”

escape() 函数已被弃用,但可用于对感叹号、单引号、左括号和右括号进行 URL 编码。而且由于星号是否必须在 URL 中编码存在一些歧义,并且编码也没有什么坏处,因此您可以使用诸如 replace() 函数调用之类的方法显式编码。[请注意,escape() 函数作为第二个参数传递给第一个 replace() 函数调用。如此处使用的,replace 为每个匹配的特殊字符 !、'、( 或 ) 调用一次 escape() 函数,并且 escape 仅返回该字符的“转义序列”以进行替换,这会将任何转义字符与另一个字符重新组合碎片。]

另请参阅“https://stackoverflow.com/questions/6533561/urlencode-the-asterisk-star-character”

此外,虽然一些网站甚至将星号(*)标识为 RFC3986 下的保留字符,但它们并未将其包含在其 URL 组件编码工具中。

未编码的 URL 参数:

parm1=this is a test of encoding !@#$%^&*()'
parm2=note that * is not encoded

编码的 URL 参数:

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
于 2014-01-01T21:11:37.513 回答