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