url 就是平时我们所说的网址,一般来说 url 只能使用英文字母、阿拉伯数字和一些英文的标点符号组成。其实在网络中 url 并不是可以直接拿来使用的,因为 url 中可以携带一些参数,出于安全考虑,需要使用 ascii 字符集对其编码后才可以使用。
ascii 的全称是 american standard code for information interchange,中文是“美国信息交换标准代码”的意思,它是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。ascii 是最通用的信息交换标准,ascii 第一次发表是在 1967 年,最后一次更新则是在 1986 年,到目前为止共定义了 128 个字符。
url 的编码原则是,使用安全的字符(没有特殊用途或者特殊意义的字符)来表示那些不安全的字符。只有英文字母(a-za-z)、数字(0-9)、- _ . ~
4 个特殊字符以及所有保留字符才可以不经编码直接使用。
在 url 编码的过程中,会执行以下操作步骤:
将所有认为“不安全”的字符转换为“%xx”的形式,其中 xx 是字符的十六进制 ascii 值;
将空格转换为加号或者“ ”,将加号转换为“+”。
下表中列出了要替换的字符、ascii 码和替换后的字符。
要转换的符号 | ascii 码 | 转换后的字符 | 要转换的符号 | ascii 码 | 转换后的字符 |
---|---|---|---|---|---|
退格 | 08 | o | 79 | o | |
tab 缩进 | 09 | p | 80 | p | |
换行 | 10 | q | 81 | q | |
回车 | 13 | r | 82 | r | |
空格 | 32 | 或 | s | 83 | s |
! | 33 | ! | t | 84 | t |
" | 34 | " | u | 85 | u |
# | 35 | # | v | 86 | v |
$ | 36 | $ | w | 87 | w |
% | 37 | % | x | 88 | x |
& | 38 | & | y | 89 | y |
' | 39 | ' | z | 90 | z |
( | 40 | ( | [ | 91 | [ |
) | 41 | ) | \ | 92 | \ |
* | 42 | * | ] | 93 | ] |
43 | + | ^ | 94 | ^ | |
' | 44 | , | _ | 95 | _ |
- | 45 | - | . | 96 | ` |
. | 46 | . | a | 97 | a |
/ | 47 | / | b | 98 | b |
0 | 48 | 0 | c | 99 | c |
1 | 49 | 1 | d | 100 | d |
2 | 50 | 2 | e | 101 | e |
3 | 51 | 3 | f | 102 | f |
4 | 52 | 4 | g | 103 | g |
5 | 53 | 5 | h | 104 | h |
6 | 54 | 6 | i | 105 | i |
7 | 55 | 7 | j | 106 | j |
8 | 56 | 8 | k | 107 | k |
9 | 57 | 9 | l | 108 | l |
: | 58 | : | m | 109 | m |
; | 59 | ; | n | 110 | n |
< | 60 | < | o | 111 | 0 |
= | 61 | = | p | 112 | p |
> | 62 | > | q | 113 | q |
? | 63 | ? | r | 114 | r |
@ | 64 | @ | s | 115 | s |
a | 65 | a | t | 116 | t |
b | 66 | b | u | 117 | u |
c | 67 | c | v | 118 | v |
d | 68 | d | w | 119 | w |
e | 69 | e | x | 120 | x |
f | 70 | f | y | 121 | y |
g | 71 | g | z | 122 | z |
h | 72 | h | { | 123 | { |
i | 73 | i | | | 124 | | |
j | 74 | j | } | 125 | } |
k | 75 | k | ~ | 126 | ~ |
l | 76 | l | delete | 127 | |
m | 77 | m | >127 | 用“%xx”格式的编码表示,其中“xx”是字符的十六进制 ascii 值 | |
n | 78 | n |
以请求“http://c.biancheng.net/http url”这一 url 为例,因为 url 中包含一个空格,所以在请求时会把这个空格转换为“ ”,具体的 http 请求如下所示:
get /http url http/1.1
host: c.biancheng.net
...
前面主要介绍的主要是纯英文的 url,那如果 url 中包含中文的话该怎么办呢?由于 ascii 字符集中并不包含中文的编码,所以客户端会将 url 里面的中文进行 utf-8 编码,例如“中”字的 utf-8 编码为“e4 b8 ad”,那么经过客户端转码后“中”字会被转换为“中”。以访问“http://www.51sjk.com/upload/articles/1/0/330/330480_20220923115621517.jpg url 为例,http 请求如下所示:
get /?name=c语言中文网 http/1.1
host: c.biancheng.net
connection: keep-alive
pragma: no-cache
cache-control: no-cache
upgrade-insecure-requests: 1
通过上面的 http 请求可以看出,客户端直接将 url 中的“c语言中文网”转换成了“c语言中文网”。