decodeURIComponent和decodeURI有什么区别?
JavaScript函数decodeURIComponent
和decodeURI
什么区别?
为了解释这两者之间的差异,让我解释一下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不会。