减小

增大

默认

护眼

夜间

默认

HTTP URL编码

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 值;
  • 将空格转换为加号或者“%20”,将加号转换为“%2B”。

下表中列出了要替换的字符、ASCII 码和替换后的字符。

要转换的符号 ASCII 码 转换后的字符 要转换的符号 ASCII 码 转换后的字符
退格 08 %08 O 79 O
tab 缩进 09 %09 P 80 P
换行 10 %0A Q 81 Q
回车 13 %0D R 82 R
空格 32 %20 或 + S 83 S
! 33 %21 T 84 T
" 34 %22 U 85 U
# 35 %23 V 86 V
$ 36 %24 W 87 W
% 37 %25 X 88 X
& 38 %26 Y 89 Y
' 39 %27 Z 90 Z
( 40 %28 [ 91 %5B
) 41 %29 \ 92 %5C
* 42 * ] 93 %5D
+ 43 %2B ^ 94 %5E
' 44 %2C _ 95 _
- 45 - . 96 %60
. 46 . a 97 a
/ 47 %2F 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 %3A m 109 m
; 59 %3B n 110 n
< 60 %3C o 111 0
= 61 %3D p 112 p
> 62 %3E q 113 q
? 63 %3F r 114 r
@ 64 %40 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 %7B
I 73 I | 124 %7C
J 74 J } 125 %7D
K 75 K ~ 126 %7E
L 76 L delete 127 %7F
M 77 M   >127 用“%xx”格式的编码表示,其中“xx”是字符的十六进制 ASCII 值
N 78 N      

以请求“http://c.biancheng.net/HTTP URL”这一 URL 为例,因为 URL 中包含一个空格,所以在请求时会把这个空格转换为“%20”,具体的 HTTP 请求如下所示:

GET /HTTP%20URL HTTP/1.1
Host: c.biancheng.net
...

前面主要介绍的主要是纯英文的 URL,那如果 URL 中包含中文的话该怎么办呢?由于 ASCII 字符集中并不包含中文的编码,所以客户端会将 URL 里面的中文进行 UTF-8 编码,例如“中”字的 UTF-8 编码为“E4 B8 AD”,那么经过客户端转码后“中”字会被转换为“%E4%B8%AD”。以访问“http://c.biancheng.net/?name=C语言中文网”这一 URL 为例,HTTP 请求如下所示:

GET /?name=C%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91 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%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91”。