文章目录
- HTTP URL编码
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 | l | 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://www.csdn.net/HTTP URL”这一 URL 为例,因为 URL 中包含一个空格,所以在请求时会把这个空格转换为“%20”,具体的 HTTP 请求如下所示:
GET /HTTP%20URL HTTP/1.1
Host: www.csdn.net
...
前面主要介绍的主要是纯英文的 URL,那如果 URL 中包含中文的话该怎么办呢?由于 ASCII 字符集中并不包含中文的编码,所以客户端会将 URL 里面的中文进行 UTF-8 编码,例如“中”字的 UTF-8 编码为“E4 B8 AD”,那么经过客户端转码后“中”字会被转换为“%E4%B8%AD”。以访问“http://www.csdn.net/?name=“CSDN博客”这一 URL 为例,HTTP 请求如下所示:
GET /?name=C%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91 HTTP/1.1
Host: www.csdn.net
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
通过上面的 HTTP 请求可以看出,客户端直接将 URL 中的“CSDN博客”转换成了“C%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91”。