decodeURIComponent和decodeURI有什么区别?

JavaScript函数decodeURIComponentdecodeURI什么区别?

为了解释这两者之间的差异,让我解释一下encodeURI和encodeURIComponent的区别。

主要区别在于:

  • encodeURI旨在用于完整的URI。
  • encodeURIComponent旨在用于.. well .. URI组件,它是位于分隔符(; /?:@&= + $,#)之间的任何部分。

因此,在encodeURIComponent中,这些分隔符也被编码,因为它们被认为是文本而不是特殊字符。

现在回到解码函数之间的区别,每个函数解码由其对应的编码对象生成的string,以处理特殊字符的语义及其处理。

encodeURIComponent / decodeURIComponent()几乎总是您想要使用的对,用于将URI部分中的文本string拼接在一起并拆分。

encodeURI不那么常见,误导性地命名为:它应该真的叫做fixBrokenURI。 它需要的东西几乎是一个URI,但它有无效的字符,如空格,并将其变成一个真正的URI。 它可以有效地用于修复用户input中的无效URI,也可以用来将IRI(包含纯Unicode字符的URI)转换为纯URI(使用%-escaped UTF-8编码非ASCII )。

decodeURI解码与decodeURIComponent相同的字符,除了一些特殊的字符。 它被提供为encodeURI的逆向函数,但是你仍然不能指望它返回到原来的位置 – 参见例如。 decodeURI(encodeURI('%20 '));

encodeURI实际上应该被命名为fixBrokenURI(),decodeURI()同样可以被称为潜在的上一个早期工作()。 我可以想到在任何地方都没有任何有效的用途; 避免。

 js> s = "http://www.example.com/string with + and ? and & and spaces"; http://www.example.com/string with + and ? and & and spaces js> encodeURI(s) http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces js> encodeURIComponent(s) http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces 

看起来像encodeURI通过编码空格和一些其他(例如不可打印)字符来产生“安全”URI,而encodeURIComponent另外编码冒号,斜杠和加号字符,并且被用于查询string中。 +和?的编码 和&在这里是特别重要的,因为这些是查询string中的特殊字符。

encodeURIComponent()

将input转换为URL编码的string

encodeURI()

对input进行URL编码,但假设给出了完整的URL,所以通过不编码协议(例如http:// )和主机名(例如http://www.stackoverflow.com )来返回有效的URL。

decodeURIComponent()decodeURI()与上面相反

由于我有同样的问题,但在这里没有find答案,我做了一些testing,以找出其实际差异。 我这样做,因为我需要的东西,这不是URL / URI相关的编码。

  • encodeURIComponent("A")返回“A”,它不会将“A”编码为“%41”
  • decodeURIComponent("%41")返回“A”。
  • encodeURI("A")返回“A”,它不会将“A”编码为“%41”
  • decodeURI("%41")返回“A”。

这意味着两者都可以解码字母数字字符,即使它们没有对它们进行编码。 然而…

  • encodeURIComponent("&")返回“%26”。
  • decodeURIComponent("%26")返回“&”。
  • encodeURI("&")返回“&”。
  • decodeURI("%26")返回“%26”。

即使encodeURIComponent不编码所有字符,decodeURIComponent也可以解码%00和%7F之间的任何值。

注意:如果尝试解码%7F以上的值(除非它是一个unicode值),那么脚本将会失败并显示“URI错误”。

decodeURIComponent将解码URI特殊标记,如&,?,#等,decodeURI不会。