URL 编码:别让“空格 + 中文”把链接搞崩
61
0
0
URL 只能安全运送 7 位 ASCII 字符,任何“超标”字符(空格、中文、&、# 等)必须先“打包”成 %xx 形式,否则浏览器、网关、服务器三方一起懵圈。
1. 哪些字符必须打包?
| 典型字符 | 打包后 | 原因 |
|---|---|---|
| 空格 | %20 或 + | 肉眼看不见,易被截断 |
& | %26 | 与查询分隔符冲突 |
= | %3D | 键值对解析器会误判 |
# | %23 | 锚点标志,不编码就提前结束 URL |
| 中文 | %E4%BD%A0… | 非 ASCII,必须 UTF-8 后转 % |
% 本身 | %25 | 保留字,用来表示 %,自身需转义 |
2. JS 两行搞定打包
// 1. 整段 URL 外壳保留,只打包参数
let url = 'https://example.com/search?q=' + encodeURIComponent('空格+中文&危险字符');
// 结果:https://example.com/search?q=%20%2B%E4%B8%AD%E6%96%87%26%E5%8D%B1%E9%99%A9%E5%AD%97%E7%AC%A6
// 2. 只想让浏览器地址栏可读,用 encodeURI
let readable = encodeURI('https://example.com/我的文件.txt');
// 结果:https://example.com/%E6%88%91%E7%9A%84%E6%96%87%E4%BB%B6.txtencodeURIComponent见谁打谁,适合“参数值”encodeURI放过保留字符,适合“整条地址”
3. 表单自动打包?别全信!
GET 表单提交时,浏览器会帮你编码空格、中文;但不会编码 &、= 这类“保留字”——如果用户在输入框里敲了 &,服务器会把后半截当成新参数,直接裂成两半 。
→ 核心参数仍建议手动 encodeURIComponent() 后再拼 URL。
4. 后端也要补刀
| 语言 | 打包函数 | 拆包函数 |
|---|---|---|
| JavaScript | encodeURIComponent() | decodeURIComponent() |
| Python | urllib.parse.quote() | urllib.parse.unquote() |
| Java | URLEncoder.encode() | URLDecoder.decode() |
统一用 UTF-8 字符集 编码,可最大限度避免乱码 。
5. 一句话收工
URL 编码没有黑科技,就是“把歧义字符换成 %xx”。
前端拼参数、后端接参数,都记得先打包再传输——
省得用户一个空格,把你的链路炸成 400 Bad Request。
0
快来点个赞吧
发表评论
评论列表