URL 编码器
编码和解码 URL 和特殊字符
如何使用URL 编码器
- 1粘贴需要编码的 URL 或查询字符串。
- 2选择编码方式:百分号编码(URL encode)或解码。
- 3查看编码结果,特殊字符被安全转义为 %XX 形式。
URL 编码是什么?
空格 → %20;中文/特殊字符 → UTF-8 字节的 %XX 序列URL 只能安全包含少数字符(字母、数字和少数符号)。空格、中文、&、= 等字符在网址中有特殊含义或无法传输,必须用百分号编码转义为 % 加两位十六进制。
编码后链接才能被正确解析与传输,避免参数被截断或注入。解码则是逆向过程,把 %XX 还原为原字符。表单提交、API 调用与拼接查询参数时常会用到。
URL 编码(百分号编码)把非 ASCII 字符和保留字符转成 %XX 形式,XX 是该字节的十六进制。中文在 UTF-8 下通常是 3 个字节,所以「中」编码成 %E4%B8%AD(3 个 %XX)。**关键点是:编码的是字节而非字符**——同一字符在 UTF-8 和 GBK 下编码结果完全不同,这也是早期乱码问题的根源。现代浏览器和服务器统一用 UTF-8。
最容易踩的坑有两个:① **空格编码成 %20 还是 +**?在 application/x-www-form-urlencoded(表单 POST)里空格是 +,在 URL 路径和查询串里是 %20。混用会导致服务端解析出错。② **多次编码**:对已编码的串再编一次,%20 会变成 %2520(% 本身被编成 %25),必须解码两次才能还原。**判断是否需要编码的标准是:如果字符在 URL 中有特殊语法含义,或不是 ASCII,就必须编码。**
| 字符 | 编码 | 含义 | 是否需编码 |
|---|---|---|---|
| 空格 | %20 | 空格 | 是(+ 亦可) |
| ! | %21 | 感叹号 | 否 |
| " | %22 | 双引号 | 是 |
| # | %23 | 片段标识 | 是(会截断 URL) |
| & | %26 | 参数分隔 | 是(会截断参数) |
| + | %2B | 加号 | 是(会被解成空格) |
| / | %2F | 路径分隔 | 视位置而定 |
| : | %3A | 协议分隔 | 视位置而定 |
| = | %3D | 键值分隔 | 值中需编码 |
| ? | %3F | 查询起始 | 是 |
| 中 | %E4%B8%AD | 中文字符 | 是(UTF-8 三字节) |
常见字符的 URL 编码对照
常见问题
为什么空格变成 %20?
空格不是 URL 安全字符,标准编码为 %20(也有用 + 表示表单空格的变体)。
中文为什么要编码?
URL 基于 ASCII,中文需先按 UTF-8 转成字节再逐字节 %XX 编码,接收方再解码还原。
编码会丢失信息吗?
不会。编码是可逆的,解码后即可完整还原原始字符串。
哪些字符可以不编码?
URL 规范(RFC 3986)允许的「非保留字符」:字母 A–Z、a–z,数字 0–9,以及 - _ . ~ 这四个符号。这些在任何位置都不需要编码。其余字符理论上都应编码,但实践中浏览器会宽容处理一部分。安全起见,构造 URL 时只保留这 66 个字符原样,其他一律编码。
encodeURI 和 encodeURIComponent 有什么区别?
encodeURI 假设输入是完整 URL,不会编码 : / ? # & = 等语法字符;encodeURIComponent 假设输入是 URL 的一个组成部分(参数值),会把 : / ? # & = 全部编码。**传参数值时必须用 encodeURIComponent**,用错会导致参数被截断或注入额外参数。例如 value 为 a&b=1 时,用 encodeURI 拼接会变成两个参数,用 encodeURIComponent 才是正确的一个参数值。
