解码URIComponent和解码URI有什么区别?


Answers:


398

要解释这两者之间的差异让我解释之间的差异encodeURIencodeURIComponent

主要区别在于:

  • encodeURI功能旨在用于完整的URI。
  • encodeURIComponent函数旨在在..好.. URI组件上使用,该组件是位于分隔符(; /?:@&= + $,#)之间的任何部分。

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

现在回到解码功能之间的区别,每个功能都在考虑特殊字符的语义及其处理的情况下,解码由其对应的编码对象生成的字符串。


4
另一个重要的区别是unescape不处理多字节UTF-8序列,而decodeURI [Component]可以:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris

恕我直言,举一些例子将非常有用
Transang

114

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

encodeURI不太常见,并且具有误导性:它实际上应该称为fixBrokenURI。它所使用的内容几乎是URI,但其中包含无效字符(例如空格),然后将其转换为真实的URI。它可以有效地修复来自用户输入的无效URI,还可以用于将IRI(带有裸Unicode字符的URI)转换为纯URI(使用%转义的UTF-8编码非ASCII) )。

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

在真正将encodeURI命名为fixBrokenURI()的地方,decodeURI()可以等同地称为潜在地BreakingMyPreviouslyWorkingURI()。我认为在任何地方都没有有效的用途。避免。


11
encodeURI(encodeURI('%20'))在chrome和firefox中正确给出了'%20',只是想知道从哪个浏览器/版本看到的错误结果?
ccppjava

1
可能在2009年就被打破了,但是与此同时,现代浏览器却风起云涌(我猜)。
WoodrowShigeru '16

68
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另外对冒号,斜杠和加号字符进行编码,并打算在查询字符串中使用。+和?的编码 和&在这里特别重要,因为它们是查询字符串中的特殊字符。


30

由于我有相同的问题,但在这里找不到答案,因此我进行了一些测试,以找出实际的区别。我这样做是因为我需要某种与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错误”。


注意:第一个解码URIComponent中有一个错字(用m代替n)。我不能纠正它,因为我必须编辑至少6个字符。
SuperNova

23

encodeURIComponent()

将输入转换为URL编码的字符串

encodeURI()

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

decodeURIComponent()decodeURI()上面的相反


12

encodeURIComponent将解码URI特殊标记(例如&,?,#等),decodeURI则不会。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.