Javascript decodeURI组件和decodeURI之间的区别是什么?

Javascript decodeURI组件和decodeURI之间的区别是什么?,javascript,Javascript,JavaScript函数decodeURIComponent和decodeURIComponent之间的区别是什么?为了解释这两个函数之间的区别,让我来解释encodeURIComponent和encodeURIComponent之间的区别 主要区别在于: encodeURI函数用于完整URI encodeURIComponent功能用于。。好。。URI组件是 位于分隔符(;/?:@&=+$,#)之间的任何部分 因此,在encodeURIComponent中,这些分隔符也被编码,因为它们被视

JavaScript函数
decodeURIComponent
decodeURIComponent
之间的区别是什么?

为了解释这两个函数之间的区别,让我来解释
encodeURIComponent
encodeURIComponent
之间的区别

主要区别在于:

  • encodeURI
    函数用于完整URI
  • encodeURIComponent
    功能用于。。好。。URI组件是 位于分隔符(;/?:@&=+$,#)之间的任何部分
因此,在
encodeURIComponent
中,这些分隔符也被编码,因为它们被视为文本而不是特殊字符

现在回到解码函数之间的区别,每个函数对其对应的编码对应项生成的字符串进行解码,同时考虑特殊字符的语义及其处理

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

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

decodeURI组件将解码URI特殊标记,如&、?、#等,而decodeURI不会

encodeURIComponent()

将输入转换为URL编码 串

encodeURI()

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


decodeURIComponent()
decodeURI()
与上述相反

encodeURIComponent/decodeURIComponent()几乎总是要使用的一对,用于将URI部分中的文本字符串连接在一起并拆分

encodeURI不太常见,而且名称有误导性:它真的应该被称为FixBrokerNuri。它接受接近URI的内容,但其中包含无效字符(如空格),并将其转换为真正的URI。它可以有效地用于修复用户输入中的无效URI,还可以用于将IRI(中包含裸Unicode字符的URI)转换为普通URI(使用转义UTF-8对非ASCII进行编码)

decodeURI解码与decodeURIComponent相同的字符,除了一些特殊字符。它被提供为encodeURI的逆函数,但是您仍然不能指望它返回与您最初输入的相同的值 — 参见例如
decodeURI(encodeURI(“%20”)


在encodeURI真正应该命名为fixBrokerUri()的地方,decodeURI()同样可以被称为potentiallyBreakMyPreviouslyWorkingURI()。我想不出它在任何地方都有什么用处;避免。

因为我有同样的问题,但在这里没有找到答案,所以我做了一些测试,以找出真正的区别。 我这样做了,因为我需要一些与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错误”。

未逃脱:

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

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


decodeURI(encodeURI(“%20”)在ie、chrome和firefox中正确地给出了“%20”,只是想知道您在哪个浏览器/版本中观察到了不正确的结果?可能在2009年被破坏了,但现代浏览器在这段时间内赶上了(我猜)。注意:第一个decodeURI组件中有一个输入错误(m而不是n)。我无法更正它,因为我必须编辑至少6个字符。另一个重要的区别是,unescape不处理多字节UTF-8序列,而decodeURI[Component]处理:
decodeURIComponent(“%C3%A9”)==“é”;unescape(“%C3%A9”)=“Ô)
IMHO,给出一些示例将非常有用。注意
decodeURI(“%C3%A9”)=“é”
。除非您有特定理由不允许编码
application/x-www-form-urlencoded
decodeURI()
将是最佳选择,因为浏览器通常以
application/x-www-form-urlencoded
的形式发送数据。最常见的区别是处理
+
。应该可以对所有内容使用
encodeURIComponent()
,但始终使用
decodeURI()
进行解码。对于
encodeURIComponent()
的输出,使用
decodeURI()
decodeURIComponent()
并不重要。如果需要处理浏览器发出的查询字符串,则正确解析该字符串可能需要使用
decodeURI()
而不是
decodeURIComponent()