JavaScript函数decodeURIComponent
和decodeURI
之间有什么区别?
答案 0 :(得分:348)
为了解释这两者之间的区别,让我解释一下encodeURI
和encodeURIComponent
之间的区别。
主要区别在于:
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