JavaScript 函数decodeURIComponent
和decodeURI
?
decodeURIComponent 和 decodeURI 有什么区别?
要解释这两者之间的差异让我解释之间的差异encodeURI
和encodeURIComponent
。
主要区别在于:
- 该
encodeURI
函数旨在用于完整的 URI。 - 该
encodeURIComponent
函数旨在用于 .. 好吧 .. URI 组件,即位于分隔符 (; / ? : @ & = + $ , #) 之间的任何部分。
因此,在encodeURIComponent
这些分隔符中进行编码也是因为它们被视为文本而不是特殊字符。
现在回到 decode 函数之间的区别,每个函数都对由其对应的 encode 对应项生成的字符串进行解码,并负责特殊字符的语义及其处理。
encodeURIComponent/decodeURIComponent() 几乎总是您要使用的对,用于将 URI 部分中的文本字符串连接在一起和拆分。
encodeURI 不太常见,并且命名有误导性:它实际上应该称为 fixBrokenURI。它需要一些几乎是 URI 但其中包含无效字符(例如空格)的东西,并将其转换为真正的 URI。它可以有效地修复用户输入中的无效 URI,也可以用于将 IRI(带有裸 Unicode 字符的 URI)转换为纯 URI(使用 %-escaped UTF-8 对非 ASCII 进行编码) )。
在应该将 encodeURI 真正命名为 fixBrokenURI() 的情况下,decodeURI() 也可以同样称为潜在的BreakMyPreviouslyWorkingURI()。我想不出它在任何地方的有效用途;避免。
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 错误”。
encodeURIComponent()
将输入转换为 URL 编码的字符串
encodeURI()
URL 编码输入,但假设给出了完整的 URL,因此通过不编码协议(例如http://)和主机名(例如 www.stackoverflow.com)返回一个有效的 URL 。
decodeURIComponent()
并且与decodeURI()
上述相反