我应该使用encodeURI或encodeURIComponent来编码URL吗?

时间:2010-12-27 18:10:31

标签: javascript

这两种方法中的哪一种应该用于编码网址?

9 个答案:

答案 0 :(得分:267)

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

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

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

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

答案 1 :(得分:87)

如果您要编码一个字符串以放入一个URL组件(一个查询字符串参数),您应该调用encodeURIComponent

如果您要对现有网址进行编码,请致电encodeURI

答案 2 :(得分:40)

xkr.us通过示例进行了很好的讨论。引用他们的摘要:

  

escape()方法不对+字符进行编码   解释为服务器端的空间以及生成的空间   在他们的领域中有空格的形式。由于这个缺点和   事实上,此函数无法处理非ASCII字符   正确地说,你应该尽可能避免使用escape()。该   最好的选择通常是encodeURIComponent()。

     

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

     

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

     

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

     

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

     

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

答案 3 :(得分:9)

encodeURIComponent():假定其参数是一个部分(例如协议,主机名,路径或查询字符串) 一个URI。因此,它会转义用于分隔URI部分的标点字符。

encodeURI():用于编码现有网址

答案 4 :(得分:8)

这是摘要。

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

    请勿使用。

  2. encodeURI()将不会对A-Z a-z 0-9进行编码; ,/? :@&= + $-_。 ! 〜*'()#

    当您输入的内容是完整的网址(例如“ https://searchexample.com/search?q=wiki

  3. 时,请使用它
  4. encodeURIComponent()将不会对A-Z a-z 0-9-_进行编码。 ! 〜*'() 当您输入的内容是完整URL的一部分时,请使用它 例如  const queryStr = encodeURIComponent(someString)

答案 5 :(得分:2)

encodeURIencodeURIComponent之间的差异:

encodeURIComponent(value)主要用于编码queryString参数值,并对value中的每个适用字符进行编码。 encodeURI忽略协议前缀(http://)和域名。

在非常非常罕见的情况下,当您想要实现手动编码来编码其他字符时(尽管它们不需要在典型情况下编码),例如:! *,那么 你可以使用:

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

source

答案 6 :(得分:2)

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

  1. encodeURI 用于对完整 URL 进行编码,而 encodeURIComponent 用于对 URI 组件进行编码 > 例如查询字符串。

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

<头>
人物 encodeURI encodeURIComponent
# # %23
$ $ %24
& & %26
+ + %2B
, , %2C
/ / %2F
%3A
; ; %3B
= = %3D
? ? %3F
@ @ %40

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

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

答案 7 :(得分:0)

其他答案描述了目的。以下是每个函数实际转换的字符

control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
        + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
                                                                    + '\x7F'
encodeURI         (control + ' "%<>[\\]^`{|}'                             )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@'        )
escape            (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

以上所有字符都转换为百分比十六进制代码。空格为%20,百分比为%25等。以下字符不变。

以下是不会转换的字符

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru +                      "!'()~")
escape            (pass_thru +              '+/@'          )

答案 8 :(得分:-5)

一般来说,使用encodeURIComponent。不要害怕长名称认为它在使用中更具体,对我来说这是更常用的方法。也不要使用encodeURI,因为你测试它并且看起来编码正确,它可能不是你想要使用的,即使你在名字字段中使用“Fred”的简单测试工作,你会发现稍后当您使用更高级的文本(如添加&符号或主题标签)时,它将失败。您可以查看其他答案,了解其原因。