decodeURIComponent 和 decodeURI 有什么区别?

IT技术 javascript
2021-02-03 11:10:09

JavaScript 函数decodeURIComponentdecodeURI?

6个回答

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

主要区别在于:

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

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

现在回到 decode 函数之间的区别,每个函数都对由其对应的 encode 对应项生成的字符串进行解码,并负责特殊字符的语义及其处理。

恕我直言,举一些例子会非常有用
2021-03-28 11:10:09
请注意decodeURI("%C3%A9") == "é"除非您有某些特定原因不允许编码application/x-www-form-urlencodeddecodeURI()否则将是最佳选择,因为浏览器通常将数据发送为application/x-www-form-urlencoded. 最常见的区别是处理+
2021-04-02 11:10:09
另一个重要区别是 unescape 不处理多字节 UTF-8 序列,而 decodeURI[Component] 可以: decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
2021-04-09 11:10:09
应该可以encodeURIComponent()用于所有内容,但始终使用decodeURI(). 对于encodeURIComponent()的输出,如果您使用decodeURI()并不重要decodeURIComponent()如果您需要处理浏览器发出的查询字符串,正确解析可能需要使用decodeURI()而不是decodeURIComponent()
2021-04-09 11:10:09

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

encodeURI 不太常见,并且命名有误导性:它实际上应该称为 fixBrokenURI。它需要一些几乎是 URI 但其中包含无效字符(例如空格)的东西,并将其转换为真正的 URI。它可以有效地修复用户输入中的无效 URI,也可以用于将 IRI(带有裸 Unicode 字符的 URI)转换为纯 URI(使用 %-escaped UTF-8 对非 ASCII 进行编码) )。

在应该将 encodeURI 真正命名为 fixBrokenURI() 的情况下,decodeURI() 也可以同样称为潜在的BreakMyPreviouslyWorkingURI()。我想不出它在任何地方的有效用途;避免。

decodeURI(encodeURI('%20 ')) 在即 chrome 和 firefox 中正确给出 '%20 ',只是想知道从哪个浏览器/版本中观察到的错误结果?
2021-04-01 11:10:09
可能在 2009 年被打破,但现代浏览器在此期间迎头赶上(我的猜测)。
2021-04-01 11:10:09
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另外编码冒号、斜杠和加号字符,并且旨在用于查询字符串。+ 和 ? 的编码 和 & 在这里特别重要,因为它们是查询字符串中的特殊字符。

由于我有同样的问题,但没有在此处找到答案,因此我进行了一些测试以找出实际差异。我这样做了,因为我需要一些与 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 中有一个错字(m 而不是 n)。我无法更正它,因为我必须编辑至少 6 个字符。
2021-04-09 11:10:09

encodeURIComponent()

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

encodeURI()

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

decodeURIComponent()并且与decodeURI()上述相反