请说说escape、encodeURI、decodeURI、encodeURIComponent和decodeURIComponent的区别?
这五个函数都是 JavaScript 中用于处理 URI 的函数,但它们的目标和处理范围不同:
1. escape() 和 unescape():
escape(): 对字符串进行编码,将非 ASCII 字符转换为%xx或%uxxxx格式。已废弃,不推荐使用,因为它不能正确处理非 ASCII 字符,特别是 Unicode 字符。它主要用于对 ASCII 字符串进行编码,例如将空格转换为%20。unescape(): 对escape()编码的字符串进行解码。同样已废弃。
2. encodeURI() 和 decodeURI():
encodeURI(): 用于编码整个 URI。它会将 URI 中的特殊字符(例如空格、#、? 等)转换为%xx格式,但不会编码 URI 的保留字符,例如: / ? ; = + & @ #等。目的是对整个 URI 进行编码,以便在浏览器地址栏或链接中使用。decodeURI(): 对encodeURI()编码的 URI 进行解码。
3. encodeURIComponent() 和 decodeURIComponent():
encodeURIComponent(): 用于编码 URI 的组成部分,例如查询参数。它会将所有非字母数字字符(除了- _ . ! ~ * ' ( ))转换为%xx格式,包括保留字符。目的是对 URI 的各个部分进行编码,以便安全地将其作为查询参数或其他 URI 组件使用。decodeURIComponent(): 对encodeURIComponent()编码的 URI 组件进行解码。
总结与对比:
| 特性 | escape() |
encodeURI() |
encodeURIComponent() |
|---|---|---|---|
| 目的 | 编码字符串(已废弃) | 编码整个 URI | 编码 URI 组件 |
| 编码范围 | 非 ASCII 字符 | URI 中的特殊字符,不包括保留字符 | 所有非字母数字字符,包括保留字符 |
| 保留字符 | 不处理 | 不编码 | 编码 |
| 示例 | escape("你好 世界") -> %u4F60%u597D%20%u4E16%u753B (已废弃) |
encodeURI("https://www.example.com/你好 世界") -> https://www.example.com/%E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C |
encodeURIComponent("你好 世界") -> %E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C |
| 推荐使用 | ❌ | ✅ 用于编码整个 URI | ✅ 用于编码 URI 组件 |
实际应用场景:
- 如果你需要编码整个 URI,例如在
<a>标签的href属性中使用,应该使用encodeURI()。 - 如果你需要编码 URI 的一部分,例如查询参数,应该使用
encodeURIComponent()。
强烈建议避免使用escape()和unescape(),它们已经过时并且存在编码问题。 使用 encodeURI() 和 encodeURIComponent() 可以更好地处理 Unicode 字符,并提供更可靠的 URI 编码和解码功能。
浙公网安备 33010602011771号