URI所容许的字符分做保留与未保留。保留字符是那些具备特殊含义的字符. 例如, 斜线字符用于URL (或者更通常的, URI)不一样部分的分界符. 未保留字符没有这些特殊含义. 百分号编码把保留字符表示为特殊字符序列。上述情形随URI与URI的不一样版本规格会有轻微的变化。php
! |
* |
' |
( |
) |
; |
: |
@ |
& |
= |
+ |
$ |
, |
/ |
? |
# |
[ |
] |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
|
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
- |
_ |
. |
~ |
URI中的其它字符必须用百分号编码。html
若是一个保留字符在特定上下文中具备特殊含义(称做"reserved purpose") , 且URI中必须使用该字符用于其它目的, 那么该字符必须百分号编码. 百分号编码一个保留字符,首先须要把该字符的ASCII的值表示为两个16进制的数字,而后在其前面放置转义字符("%
"),置入URI中的相应位置。(对于非ASCII字符, 须要转换为UTF-8字节序, 而后每一个字节按照上述方式表示.)web
例如,"/
", 若是用做URI的路径成份的分界符, 则是具备特殊含义的保留字符. 若是该字符须要出如今URI一个路径成分的内部, 则三字符序列"%2F
"或"%2f
"就用于代替本来的"/
"出如今该URI路径成分的内部.服务器
! |
# |
$ |
& |
' |
( |
) |
* |
+ |
, |
/ |
: |
; |
= |
? |
@ |
[ |
] |
%21 |
%23 |
%24 |
%26 |
%27 |
%28 |
%29 |
%2A |
%2B |
%2C |
%2F |
%3A |
%3B |
%3D |
%3F |
%40 |
%5B |
%5D |
在特定上下文中没有特殊含义的保留字符也能够被百分号编码,在语义上与不百分号编码的该字符没有差异.app
在URI的"查询"成分(?字符后的部分)中, 例如"/
"仍然是保留字符可是没有特殊含义,除非一个特定的URI有其它规定. 该/
字符在没有特殊含义时不须要百分号编码.ide
若是保留字符具备特殊含义,那么该保留字符用百分号编码的URI与该保留字符仅用其自身表示的URI具备不一样的语义。函数
未保留字符不须要百分号编码.post
两个URI的差异若是仅是未保留字符是用百分号编码仍是用字符自身表示,那么这两个URI具备等价的语义. 但URI处理器实际上并不老是把两者视做等价. 例如, URI的消费者不该该把"%41
"与"A
", "%7E
"与"~
"视做不一样, 可是某些URI的消费者就是这么作了. 为了最大的互操做性, URI的制造者不该该把未保留字符百分号编码。编码
因为百分号字符("%")表示百分号编码字节流的存在, 所以百分号字符应该被编码为3个字节的序列:"%25",用于URI内部。url
大多数URI涉及表示任意数据, 例如IP地址或文件系统路径做为URI的成分。
1994年发布的RFC 1738规定[1], URI中的二进制数据应该表示为8位元组的序列,而后对每一个8位元组按照上述方式百分号编码. 例如,字节值0F (十六进制)应表示为"%0F
", 字节值41(十六进制)应表示为"A
"或"%41
". 优先使用未保留字符来表示这些字节值,由于这使得URL更短.
二进数据的百分号编码过程已经被外推到字符数据,甚至到不适合或未被彻底规范的地步. 在WWW初创阶段,仅仅处理ASCII字符是否编码问题,尚未什么问题。但随后发展到对非ASCII字符如何在URI中编码,缺乏标准规范的状况下致使了歧义性的解释URI的错误。
例如, 基于RFC 1738与2396的协议规定,字符数据先要根据某种字符编码转换为字节流,而后再表示为URI。若是URI不提供是何种字符编码的提示信息,那么这个URI难以可靠的解析。
2005年1月发布的RFC 3986,强制全部新的URI必须对未保留字符不加以百分号编码;其它字符要先转换为UTF-8字节序列, 而后对其字节值使用百分号编码。此前的URI不受此标准的影响。
T有一些不符合标准的把Unicode字符在URI中表示为: %uxxxx
, 其中xxxx是用4个十六进制数字表示的Unicode的码位值。任何RFC都没有这样的字符表示方法,而且已经被W3C拒绝。第三版的ECMA-262仍然包含函数escape(string)
使用这种语法, 但也有函数encodeURI(uri)
转换字符到UTF-8字节序列并用百分号编码每一个字节。
当HTML表单中的数据被提交时,表单的域名与值被编码并经过HTTP的GET或者POST方法甚至更古远的email[2]把请求发送给服务器。这里的编码方法采用了一个很是早期的通用的URI百分号编码方法,而且有不少小的修改如新行规范化以及把空格符的编码"%20
"替换为"+
" . 按这套方法编码的数据的MIME类型是application/x-www-form-urlencoded
, 当前仍用于(虽然很是过期了)HTML与XForms规范中. 此外,CGI规范包括了web服务器如何解码这类数据、利用这类数据的内容。
若是发送的是HTTP GET请求, application/x-www-form-urlencoded数据包含在所请求URI的查询成分中. 若是发送的是HTTP POST请求或经过email, 数据被放置在消息体中,媒体类型的名字被包含在消息的Content-Type头内部。