URL 编解码
对 URL 与查询字符串参数进行编码或解码。
URL 编码原理
URL 编码(也叫百分号编码)会把不安全字符替换为百分号加两位十六进制数字,对应该字符的 UTF-8 字节。在 URL 中具有特殊含义的保留字符(如 / ? # & = + 空格 等)出现在路径段或参数值中时必须百分号编码,否则会被解析器误当成分隔符。
JavaScript 内置两个相关函数。encodeURIComponent 会编码除 A–Z、a–z、0–9 以及未保留字符 - _ . ! ~ * ' ( ) 之外的所有字符,适合对单个查询参数值进行编码。encodeURI 更宽松:它保留 : / ? # & 等结构性字符,因此适合对完整 URL 编码。
本工具封装了上述两个函数,并优雅地处理失败情况。如果你粘贴了非法的百分号序列(例如 %Z),解码器会返回带说明的错误而不是直接抛异常。中文、日文、emoji 等非 ASCII 字符会先转为 UTF-8 字节再编码 —— 这是现代浏览器的统一做法。
使用场景
- 构造包含空格、符号或非 ASCII 字符的查询字符串。
- 解码日志里的 URL,查看用户实际提交了什么。
- 把跳转目标作为查询参数安全携带。
- 排查服务端收到意外字符的问题。
- 生成包含 state 参数的 OAuth 回调 URL。
最佳实践
- 对单个参数值用 encodeURIComponent,不要对完整 URL 用它。
- URL 路径中的空格用 %20;application/x-www-form-urlencoded 表单体里才用 +。
- 用户可控的值在拼接进 URL 之前先编码,防止注入。
- # 之后的 fragment 不会被发送到服务器,所以即便是编码过的凭据也不应放在那里。
常见问题
encodeURI 与 encodeURIComponent 有什么区别?
encodeURI 保留 URI 结构性字符(: / ? # & 等),适合对完整 URL 编码;encodeURIComponent 也会编码这些字符,因此适合对单个查询参数值编码。
为什么空格有时是 %20,有时是 +?
%20 是空格的标准百分号编码。+ 形式仅在 application/x-www-form-urlencoded 表单体格式中使用,是历史遗留的规则。
中文需要编码吗?
需要。非 ASCII 字符必须先 UTF-8 编码再百分号编码才能可靠地通过 URL 传输。本工具会自动处理。
为什么解码失败提示 "URI 序列不合法"?
输入中存在百分号但后面跟的不是两位合法十六进制数字。要么把字面量 % 转义成 %25,要么修正后面的字节。