URL 编解码工具 在浏览器本地完成 URL 片段的编码和解码,用的是 JavaScript 原生 encodeURIComponent / encodeURI / decodeURIComponent / decodeURI,与后端语言(Python urllib.parse、Java URLEncoder、Go url.QueryEscape)语义一致。
两种模式的本质区别:
| 模式 | 编码范围 | 典型用途 |
|---|---|---|
encodeURIComponent | 除 A-Z a-z 0-9 - _ . ! ~ * ' ( ) 外全部编码 | 单个参数值、路径段、hash 内容 |
encodeURI | 保留 URI 结构字符 : / ? # [ ] @ ! $ & ' ( ) * + , ; = | 整条 URL 粗编码 |
常见误用:把整条 https://example.com?q=... 整体丢给 encodeURIComponent — :、/、?、= 全变 %3A %2F %3F %3D,整个 URL 作为一个参数值传出去。正确做法是只对参数值调用 encodeURIComponent,然后手工拼 URL。
工具本地运行,不上传任何字符,适合处理带敏感信息的 URL(token、session、内部接口路径)。
encodeURIComponent 编码所有保留字符——`: / ? # & = + @` 全部转 `%xx`,适合编码单个参数值(用户输入、ID、关键字)。encodeURI 保留这些字符不动,适合编码整条 URL。经验法则:参数值用 Component、整条 URL 用 URI。搞错了会把 `?` `&` 一起编码掉,整个 URL 就失效。
这是两套规范:application/x-www-form-urlencoded(HTML form、查询串)把空格编成 `+`;RFC 3986(URL 路径、通用 URI)把空格编成 `%20`。`encodeURIComponent` 始终用 `%20`(更严格、全场景通用)。浏览器地址栏、大部分 API 都能同时认这两种,但少数老后端只认一种,对不上就乱码。
一个汉字在 UTF-8 下通常占 3 字节,每字节编码成 `%XX`,所以一个汉字变 9 个字符。例:「你」= `%E4%BD%A0`、「好」= `%E5%A5%BD`。如果看到 `%C4%E3%BA%C3` 这种更短的,是 GBK 编码——老网站或 Windows 粘贴过来的。标准一律按 UTF-8 处理,GBK 需要特殊库解。
一般是字符串里有孤立的 `%`(不是 `%XX` 三连字符)。常见原因:用户把 `100%` 直接塞进 URL 没转义(应为 `100%25`),或拼接时被截断了。工具会在输入框红框提示——检查红框里的字符串,手动把裸 `%` 改成 `%25` 再解。
不能。URL 编码只负责把数据安全塞进 URL 传输,不过滤恶意内容——`<script>` 编码后还是 `<script>`,服务端解码后一样执行。防注入要在服务端做输入校验、参数化查询、HTML 转义。URL 编码是传输层工具,不是安全层工具。
需要。`#` 后是 hash(fragment),浏览器不上传给服务器、只走前端路由。但 hash 里如果有空格或中文,仍要 `encodeURIComponent` 后拼入,否则浏览器会"自作主张"编一次(规则因浏览器而异),导致前端路由收到的值和你预期不一致。