预备知识
RFC3986编码与解码
-
保留字符
Url可以划分成若干个组件,协议、主机、路径等。有一些字符(:/?#[]@)是用作分隔不同组件的。例如:冒号用于分隔协议和主机,/用于分隔主机和路径,?用于分隔路径和查询参数,等等。还有一些字符(!$&'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。当组件中的普通数据包含这些特殊字符时,需要对其进行编码。
RFC3986中指定了以下字符为保留字符:
! * ' ( ) ; : @ & = + $ , / ? # [ ]
-
不安全字符
还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
符号 描述 空格 Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉 引号以及<> 引号和尖括号通常用于在普通文本中起到分隔Url的作用 # 通常用于表示书签或者锚点 % 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码 {} ^[]`~ 某一些网关或者传输代理会篡改这些字符| -
对保留字符及不安全字符进行编码
Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。
! * " ' ( ) ; : @ & %21 %2A %22 %27 %28 %29 %3B %3A %40 %26 = + $ , / ? % # [ ] %3D %2B %24 %2C %2F %3F %25 %23 %5B %5D -
题外
现在有许多资源链接都是采用标准URI格式,许多都是根据RFC3986的规定。比如mysql,redis等服务。像这些服务一般是将username和password放在URI的userInfo中,此时如果username或者password带有保留字符比如@就很尴尬了。这时候应该使用RFC3986的字符编码进行替换。我也是因为这个原因才会有这篇文章。
本文地址