这五个函数都是 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 编码和解码功能。