URL 保留字符与不安全字符:为什么必须转义
?、&、=、# 在 URL 里有结构含义,空格中文必须编码。讲清保留字符、不安全字符与百分号编码规则,避开接口传参的坑。
一、URL 的结构语法
一个完整 URL:https://tool.aistool.cn/blog/md5?utm=x#comment
?之后是查询串,&分隔参数,=赋值。#之后是页内锚点,不会发给服务器。/分隔路径,:分隔协议端口。
这些字符被 URL 语法占用了——数据里如果出现,就必须转义,否则结构会被破坏。
二、两类必须编码的字符
- 保留字符(有语法含义):
? & = # / : @ + , ; $等,出现在数据里要转义。 - 不安全字符(可能被网关/编码误改):空格、中文、
<>{}|^\`、%本身。
规则:除了字母数字和 -._~,其他都建议编码,最稳妥。
三、百分号编码的规则
编码方式是 % + 两位十六进制,值是字符 UTF-8 字节的十六进制:
- 空格 →
%20(也常被编码成+,仅限表单提交场景)。 - 「中」UTF-8 三字节 E4 B8 AD →
%E4%B8%AD。 &→%26,#→%23。
解码就是反向过程。注意 % 自己必须写成 %25,否则解码器会把它和后两位错拼成一个字节。
四、常见坑
- 参数值带 &:值「a&b」不编码的话服务器会拆成两个参数。
- 二次编码:
%20被再编码成%2520,通常因前后端各编码一次。 - encodeURIComponent vs encodeURI:前者连
/ ? &一起编码(传参数用),后者保留 URL 结构字符(转整条地址用)。
在线体验
不用装任何环境,直接用本站URL 编解码工具在线操作,数据都在浏览器本地处理,方便又安全。
常见问题
空格编码成 %20 还是 + ?
标准百分号编码是 %20;application/x-www-form-urlencoded 表单规范里空格可用 +。通用场景(路径、REST 参数)用 %20 更安全,+ 在路径中不会被还原成空格。
为什么中文网址有时显示中文有时显示 %E4%BD%A0?
浏览器地址栏为了可读会把百分号编码显示回中文,但实际传输的仍是编码后的形式。开发者工具、日志里看到的就是原始编码串。
URL 有最大长度限制吗?
协议本身没规定,但实现有:浏览器约 2000 字符起,Nginx 默认大 URI 行 8KB。GET 传大参数不靠谱,改用 POST。
