1 | https://www.example.com:8080/path/to/resource?query=param#fragment |
https://
协议(Scheme)。其他常见协议:
http
、ftp
等www.example.com
域名(Host/Domain)。
:8080
端口(Port)。默认端口如
80
、443
等可省略,非标准端口需要显式声明。/path/to/resource
路径(Path)。
?query=param
查询参数(Query String)。以
?
开头,键值对形式,多个参数用&
连接。#fragment
片段标识符(Fragment)。以
#
开头。用于在客户端定位页面内的特定部分(如锚点链接),不会发送到服务器。
了解了 URL 的结构,再要了解 URL 编码也就不难了。
先放个定义: URL 编码(百分号编码)确保 URL 的正确传输和解析,主要处理保留字符、非 ASCII 字符及不安全字符。如/
, ?
, &
, =
, #
, %
等。
那么何时需要 URL 编码呢?
提前总结: URL 要用到某个符号的部分(例如路径中用到 /
)或因为历史遗留问题禁用某个符号的,就要转码。
- 路径(Path)
- 允许直接使用:字母、数字、
-
、_
、.
、~
、/
(分隔路径)。 - 需要转码的字符:
- 空格 → 转为
%20
或+
(但+
在路径中可能被误解,建议用%20
)。 - 其他保留字符(如
/
,?
,#
,[
,]
,@
等)在路径中出现时需转码。 - 非 ASCII 字符(如中文)→ 用 UTF-8 编码后转码,例如
张三
→%E5%BC%A0%E4%B8%89
。
- 空格 → 转为
- 全部符号:
- 控制字符(0x00-0x1F, 0x7F)
- 空格(0x20 →
%20
) - 双引号
"
(0x22 →%22
) - 井号
#
(0x23 →%23
) - 百分号
%
(0x25 →%25
,当不作为编码前缀时) - 斜杠
/
(0x2F →%2F
,当出现在路径段内而非分隔符时) - 尖括号
<
>
(0x3C →%3C
,0x3E →%3E
) - 问号
?
(0x3F →%3F
,路径结束后才是查询部分) - 方括号
[
]
(0x5B →%5B
,0x5D →%5D
) - 反斜杠
\
(0x5C →%5C
) - 插入符
^
(0x5E →%5E
) - 反引号 ```(0x60 →
%60
) - 花括号
{
}
(0x7B →%7B
,0x7D →%7D
) - 竖线
|
(0x7C →%7C
)
- 允许直接使用:字母、数字、
- 查询参数(Query String)
- 允许直接使用:字母、数字、
-
、_
、.
、~
。 - 需要转码的字符:
- 空格 → 通常转为
+
或%20
(两者都常见)。 - 保留字符:
=
,&
,+
,?
,#
,%
等。例如:&
→%26
=
→%3D
?
→%3F
- 非 ASCII 字符 → UTF-8 转码,例如
张三
→%E5%BC%A0%E4%B8%89
。
- 空格 → 通常转为
- 全部符号:
- 控制字符
- 空格(0x20 →
%20
或+
) - 双引号
"
(0x22 →%22
) - 井号
#
(0x23 →%23
) - 百分号
%
(0x25 →%25
) - 与号
&
(0x26 →%26
,当不作为参数分隔符时) - 加号
+
(0x2B →%2B
,当不作为空格替代符时) - 尖括号
<
>
(0x3C →%3C
,0x3E →%3E
) - 等号
=
(0x3D →%3D
,当不作为键值分隔符时) - 方括号
[
]
(0x5B →%5B
,0x5D →%5D
) - 反斜杠
\
(0x5C →%5C
) - 插入符
^
(0x5E →%5E
) - 反引号 ```(0x60 →
%60
) - 花括号
{
}
(0x7B →%7B
,0x7D →%7D
) - 竖线
|
(0x7C →%7C
)
- 允许直接使用:字母、数字、
- 片段标识符(Fragment,即 # 后的部分)
- 规则与查询参数类似,但
#
本身必须转码为%23
。 - 全部符号:
- 控制字符
- 空格(0x20 →
%20
) - 双引号
"
(0x22 →%22
) - 井号
#
(0x23 →%23
,否则会被视为片段起始符) - 百分号
%
(0x25 →%25
) - 尖括号
<
>
(0x3C →%3C
,0x3E →%3E
) - 方括号
[
]
(0x5B →%5B
,0x5D →%5D
) - 反斜杠
\
(0x5C →%5C
) - 插入符
^
(0x5E →%5E
) - 反引号 ```(0x60 →
%60
) - 花括号
{
}
(0x7B →%7B
,0x7D →%7D
) - 竖线
|
(0x7C →%7C
)
- 规则与查询参数类似,但