decodeURIComponent和decodeURI有什么区别?

时间:2009-04-14 13:48:20

标签: javascript

JavaScript函数decodeURIComponentdecodeURI之间有什么区别?

7 个答案:

答案 0 :(得分:348)

为了解释这两者之间的区别,让我解释一下encodeURIencodeURIComponent之间的区别。

主要区别在于:

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

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

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

答案 1 :(得分:106)

encodeURIComponent / decodeURIComponent()几乎总是你想要使用的对,用于连接和拆分URI部分中的文本字符串。

encodeURI不常见,误导性地命名:它应该被称为fixBrokenURI。它需要的东西几乎是一个URI,但它中包含空格等无效字符,并将其转换为真正的URI。它可以有效地用于修复用户输入中的无效URI,它还可以用于将IRI(带有Unicode Unicode字符的URI)转换为普通URI(使用%-escaped UTF-8编码非ASCII )。

decodeURI解码与decodeURIComponent相同的字符,除了一些特殊字符。它被提供为encodeURI的反转,但你仍然不能指望它返回你最初输入的相同 - 参见例如。 decodeURI(encodeURI('%20 '));

其中encodeURI应该命名为fixBrokenURI(),decodeURI()同样可以被称为potentialBreakMyPreviouslyWorkingURI()。我认为在任何地方都没有有效的用途;避免。

答案 2 :(得分:57)

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另外编码冒号和斜杠以及加上字符,并且意味着要使用在查询字符串中。 +和?的编码和&这里特别重要,因为它们是查询字符串中的特殊字符。

答案 3 :(得分:25)

由于我有同样的问题,但在这里找不到答案,我做了一些测试,以弄清楚实际上有什么区别。 我这样做了,因为我需要编码某些东西,而不是与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值),那么您的脚本将失败并出现&#34; URI错误&#34;。< / em>的

答案 4 :(得分:23)

  

<强> encodeURIComponent()

     

将输入转换为URL编码   串

     

encodeURI()

     

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

decodeURIComponent()decodeURI()与上述

相反

答案 5 :(得分:11)

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

答案 6 :(得分:2)

encodeURIComponent方法 没有逃脱:

A-Z a-z 0-9 - _ . ! ~ * ' ( )

是encodeURI() 没有逃脱:

A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI