我应该使用 encodeURI 还是 encodeURIComponent 来编码 URL?

IT技术 javascript
2021-01-16 21:12:34

应该使用这两种方法中的哪一种来编码 URL?

6个回答

这取决于您实际想要做什么。

encodeURI 假设输入是一个完整的 URI,其中可能包含一些需要编码的字符。

encodeURIComponent 将对具有特殊含义的所有内容进行编码,因此您可以将其用于 URI 的组件,例如

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

如果您要对字符串进行编码以放入 URL 组件(查询字符串参数),则应调用encodeURIComponent.

如果要对现有 URL 进行编码,请调用encodeURI.

@Aditya:这取决于你在做什么。
2021-03-19 21:12:34
好。当我说网络服务器会这样做时,我可能说得有点仓促,但是无论您使用什么库来读取表单数据,都会为您处理。
2021-03-21 21:12:34
如果我使用 ajax,我如何解码传递给 php 的 url?
2021-03-22 21:12:34
你没有。网络服务器会自动执行此操作。
2021-03-25 21:12:34
@slaks 。我通过 get 传递参数,所以我想在 php 中检索它们。
2021-03-30 21:12:34

xkr.us有一个很好的讨论,有例子。引用他们的总结:

escape() 方法不对 + 字符进行编码,该字符在服务器端被解释为空格,以及由字段中带有空格的表单生成。由于此缺点以及此函数无法正确处理非 ASCII 字符的事实,您应尽可能避免使用 escape()。最好的选择通常是 encodeURIComponent()。

escape() 不会编码:@*/+

使用 encodeURI() 方法比 escape() 方法更专业,因为它为 URI 编码,而不是作为 URL 一部分的查询字符串。当您需要对字符串进行编码以用于任何使用 URI 并需要某些字符保持未编码状态的资源时,请使用此方法。请注意,此方法不对 ' 字符进行编码,因为它是 URI 中的有效字符。

encodeURI() 不会编码:~!@#$&*()=:/,;?+'

最后,在对 URI 的单个组件进行编码时,应在大多数情况下使用 encodeURIComponent() 方法。此方法将对某些通常被识别为 URI 的特殊字符的字符进行编码,以便可以包含许多组件。请注意,此方法不对 ' 字符进行编码,因为它是 URI 中的有效字符。

encodeURIComponent() 不会编码:~!*()'

因此,换句话说,encodeURI如果您尝试将文件名转换为 URL 并且文件名包含#在其中,则会失败
2021-03-27 21:12:34
最近学习了。TOMCAT 9 服务器更讲究可以发送到 URL 的内容。encodeURIComponent() 在需要编码的内容中有“空格”的情况下似乎效果更好。Tomcat 8 不在乎,但 9 更特别。
2021-03-29 21:12:34

这是一个总结。

  1. escape() 不会对 @ * _ + - 进行编码。/

    不要使用它。

  2. encodeURI() 不会对 AZ az 0-9 进行编码;, / ? :@ & = + $ - _ 。~ * ' ( ) #

    当您的输入是完整的 URL 时使用它,例如“ https://searchexample.com/search?q=wiki

  3. encodeURIComponent() 不会对 AZ az 0-9 - _ 进行编码。~ * ' ( ) 当您的输入是完整 URL 的一部分时使用它,例如 const queryStr = encodeURIComponent(someString)
如果要将完整的 URL 放入查询参数中,请使用 encodeURIComponent 例如 https://example.test/?url=https%3A%2F%2Fexample.test%2fhome
2021-04-01 21:12:34
这是一个很好的答案,因为它准确地说明了他们的工作。但是,我仍然有一个问题,即我应该使用哪个以及何时使用。如果我的 URI 组件是一个完整的 URL 呢?然后我应该使用上面的规则 2 或规则 3 还是两者都像 encodeURIComponent ( encodeURI (theCompleteURI ))
2021-04-05 21:12:34

encodeURIencodeURIComponent用于不同的目的。
一些区别是

  1. encodeURI用于编码完整的 URL,encodeURIComponent用于编码 URI 组件,例如查询字符串。

  2. 11 个字符不是由 encodeURI 编码的,而是由 encodeURIComponent 编码的。列表:

特点 编码URI 编码URI组件
# # %23
$ $ %24
& & %26
+ + %2B
, , %2C
/ / %2F
%3A
; ; %3B
= = %3D
? ? %3F
@ @ %40

注意:
encodeURIComponent 不编码 -_.!~*'()。如果要对这些字符进行编码,则必须将它们替换为相应的 UTF-8 字符序列

如果您想了解有关 encodeURI 和 encodeURIComponent 的更多信息,请查看参考链接。 参考链接