首页 文章

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

提问于
浏览
198

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

8 回答

  • 8

    这取决于你实际想做什么 .

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

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

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

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

    如果您要编码现有网址,请致电 encodeURI .

  • 38

    xkr.us有一个很好的讨论,有例子 . 引用他们的摘要:

    escape()方法不对在服务器端解释为空格的字符进行编码,也不对由字段中包含空格的表单生成 . 由于这个缺点以及此函数无法正确处理非ASCII字符的事实,您应该尽可能避免使用escape() . 最好的选择通常是encodeURIComponent() . escape()不会编码:@ * /使用encodeURI()方法比escape()更专业,因为它编码URI而不是查询字符串,后者是URL的一部分 . 当您需要对要用于任何使用URI并且需要某些字符保持未编码的资源的字符串进行编码时,请使用此方法 . 请注意,此方法不对'字符进行编码,因为它是URI中的有效字符 . encodeURI()不会编码:〜!@#$&()=:/ ,;?最后,在编码URI的单个组件时,大多数情况下都应该使用encodeURIComponent()方法 . 此方法将编码某些字符,这些字符通常被识别为URI的特殊字符,因此可以包含许多组件 . 请注意,此方法不对'字符进行编码,因为它是URI中的有效字符 . encodeURIComponent()不会编码:〜!()'

  • 1

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

    encodeURI():用于编码现有的url

  • 80

    这是一个总结 .

    • escape()不会编码@ * _ - . /

    不要使用它 .

    • encodeURI()不会编码A-Z a-z 0-9; ,/? :@&= $ - _ . ! 〜*'()#

    当你的输入是像'https://searchexample.com/search?q=wiki'这样的完整网址时使用它

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

    encodeURI和encodeURIComponent之间的区别:

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


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

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

    source

  • 0

    其他答案描述了目的 . 以下是每个函数的字符 will actually convert

    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 等 . 下面的字符不变 .

    这是函数 will NOT convert 的字符:

    pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    
    encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
    encodeURIComponent(pass_thru +                      "!'()~")
    escape            (pass_thru +              '+/@'          )
    
  • 3

    作为一般规则使用 encodeURIComponent . 唐't be scared of the long name thinking it'更具体的是's use, to me it'是更常用的方法 . 也可能不是你想要使用的东西,即使你在名字字段中使用"Fred"进行的简单测试有效,你会发现稍后当你使用更高级的文本时,比如添加一个&符号或标签,它就会失败 . 您可以查看其他答案,了解其原因 .

相关问题