如果要对查询字符串进行编码,请使用encodeURIComponent
. 原因很简单:在其他几个字符中,它会编码正斜杠和不会编码的 amersand encodeURI
。
编码URI组件
什么用途?假设您要对 URL 进行编码并将其传递到查询字符串中,这将使您可以对所有字符进行编码,从而得到如下内容:
encodeURIComponent('http://abc.com/my page.html?name=bob&foo=bar')
得到结果
"http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar"
您现在可以像这样安全地将其作为查询字符串传递:
http://mysite.com/foo=http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar
请注意两个 URL 如何具有查询字符串参数foo
,但这没关系,因为编码的 URL 具有该编码。整个foo
参数为
http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar
foo=bar
与第二个编码的 URL 中的没有冲突。
编码URI
现在,如果您想对已有的完整 URL 进行编码,请使用encodeURI
.
encodeURI('http://abc.com/my page.html?name=bob&foo=bar')
会给你
"http://abc.com/my%20page.html?name=bob&foo=bar"
请注意这如何使 URL 保持有效,并且在这种情况下仅对空间进行编码。如果你在上面运行encodeURIComponent
,你会得到你在我的第一个例子中看到的一团糟。
编码了哪些字符?
正如 yabol 在您的第一篇文章中评论的那样,此页面向您展示了encodeURI、encodeURIComponent 和 escape: lower ASCII characters 之间的区别。您特别注意到它对以下不encodeURIComponent
编码的字符进行了编码:encodeURI
chr encodeURI(chr) encodeURIComponent(chr)
+ + %2B
/ / %2F
@ @ %40
# # %23
$ $ %24
& & %26
, , %2C
: : %3A
; ; %3B
= = %3D
? ? %3F
你的问题
您使用是正确的,encodeURIComponent
因为您正在为查询字符串编码 URL。这可以追溯到我的第一个例子。如果您的查询字符串 URL(您正在编码的那个)有一个查询字符串,您希望它成为 的一部分next
,而不是您的主 URL 的一部分。
错误的
"http://example.com/?next=" + encodeURI('http://abc.com/my page.html?name=bob&foo=bar')
"http://example.com/?next=http://abc.com/my%20page.html?name=bob&foo=bar"
您的 example.com url 有两个查询字符串参数:next
和foo
对
"http://example.com/?next=" + encodeURIComponent('http://abc.com/my page.html?foo=bar')
"http://example.com/?next=http%3A%2F%2Fabc.com%2Fmy%20page.html%3Fname%3Dbob%26foo%3Dbar"
您的 example.com url 仅包含一个查询字符串参数:next