何时应使用 escape 而非 encodeURI / encodeURIComponent?
何时应使用 escape 而非 encodeURI / encodeURIComponent?
技术背景
在 JavaScript 中,处理字符串的 URL 编码有三个常用函数:escape()
、encodeURI()
和 encodeURIComponent()
。不同的函数有不同的编码规则和使用场景,了解它们之间的区别有助于开发者正确处理 URL 编码。
实现步骤
1. escape()
- 使用建议:不建议使用该函数。
escape()
已被弃用,其定义在相关规范的附录中,该附录指出其中的特性存在不良特征,在没有遗留使用的情况下应从规范中移除。 - 编码规则:除了
@*_+-./
外,特殊字符都会被编码。对于代码单元值为 0xFF 或更小的字符,使用两位十六进制转义序列%xx
;对于代码单元值更大的字符,使用四位格式%uxxxx
,但这种格式在查询字符串中不被允许。
2. encodeURI()
- 使用场景:当你想要一个有效的完整 URL 时使用。
- 编码规则:不会编码
~!@#$&*()=:/,;?+'
这些字符,它会保留 URI 的结构,不会对具有特殊含义的保留字符进行编码。 - 示例:
1 |
|
3. encodeURIComponent()
- 使用场景:当你想要对 URL 参数的值进行编码时使用。
- 编码规则:不会编码
- _ . ! ~ * ' ( )
这些字符,它会对传入的字符串进行全面编码,忽略 URI 的结构。 - 示例:
1 |
|
核心代码
生成 encodeURI()
和 encodeURIComponent()
编码差异的表格
1 |
|
自定义编码和解码函数
1 |
|
修正的 encodeURI()
和 encodeURIComponent()
函数
1 |
|
最佳实践
- 使用
encodeURIComponent()
处理 URL 参数:在拼接 URL 参数时,使用encodeURIComponent()
对参数值进行编码,以避免参数值中的特殊字符影响 URL 的正确性。
1 |
|
- 避免使用
encodeURI()
:由于encodeURI()
可能会导致一些字符未被正确编码,建议使用修正后的fixedEncodeURI()
函数。 - 使用
escape()
的场景:仅当数据仅用于 JavaScript 解析时,如在 URI 的哈希部分,可以使用escape()
。但由于其已被弃用,使用时需谨慎。
常见问题
1. encodeURIComponent()
未对 *
进行编码
encodeURIComponent()
不会对 - _ . ! ~ * ' ( )
这些字符进行编码,这可能会导致问题。可以使用修正后的 fixedEncodeURIComponent()
函数来解决。
2. decodeURIComponent()
未正确解码 +
decodeURIComponent()
不会将 +
解码为空格,需要手动处理。可以在编码时将 +
替换为 %2B
。
3. 编码函数对单独代理项的处理
encodeURI()
和 encodeURIComponent()
在遇到单独代理项(0xD800 - 0xDFFFF)时会抛出 URIError
,而 escape()
不会,它会将其编码为 %uXXXX
格式。
何时应使用 escape 而非 encodeURI / encodeURIComponent?
https://119291.xyz/posts/when-to-use-escape-instead-of-encodeuri-or-encodeuricomponent/