decodeURIComponent和decodeURI有什么区别?

Jon*_*ury 334 javascript

JavaScript函数decodeURIComponent和有decodeURI什么区别?

Mah*_*eTo 373

为了解释这两者之间的区别,让我解释一下encodeURI和encodeURIComponent之间的区别.

主要区别在于:

  • encodeURI旨在用于完整URI.
  • encodeURIComponent旨在用于.. well .. URI组件,它是位于分隔符之间的任何部分(; /?:@&= + $,#).

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

现在回到解码函数之间的差异,每个函数解码由其相应的编码对应物生成的字符串,处理特殊字符的语义及其处理.

  • 另一个重要区别是unescape不处理多字节UTF-8序列,而decodeURI [Component]则执行:`decodeURIComponent("%C3%A9")=="é"; unescape("%C3%A9")=="Ã"";` (4认同)
  • 恕我直言,给出一些例子会非常有用 (4认同)

bob*_*nce 112

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().我认为在任何地方都没有有效的用途; 避免.

  • decodeURI(encodeURI('%20'))正确地给出'%20',即chrome和firefox,只是想知道你从哪个浏览器/版本看到错误的结果? (11认同)

Jas*_*n S 60

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
Run Code Online (Sandbox Code Playgroud)

看起来像encodeURI通过编码空格和一些其他(例如不可打印的)字符来生成"安全"URI,而encodeURIComponent另外编码冒号和斜杠以及加号字符,并且用于查询字符串.+和?的编码 和&在这里特别重要,因为这些是查询字符串中的特殊字符.


小智 27

由于我有同样的问题,但没有在这里找到答案,我做了一些测试,以弄清楚实际上是什么区别.我做了这个,因为我需要编码的东西,这不是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错误".


Rus*_*Cam 23

encodeURIComponent()

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

encodeURI()

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

decodeURIComponent()decodeURI()上述相反


Bjo*_*orn 11

decodeURIComponent将解码URI特殊标记,如&,?,#等,decodeURI不会.