最近半年我写了很多Web方面的文章,看上去很简单,但如果深究下去,则不是那么一回事了,今天聊聊url编码的事情。
很多人对urlencode编码很熟悉,但对rawurlencode却了解不多,其实对于URL编码,rawurlencode才是标准,它定义在 RFC3986 上,这个 RFC 描述了如何定义一个 URL,URL 其实本质上不是 HTTP 协议的一部分,只是 URL 和 HTTP 协议结合的比较紧密,所以总觉得 HTTP 协议包含 URL。
先描述下rawurlencode,它也叫做百分号编码(Percent-encoding),首先思考一个问题,为什么URL需要编码,原因就在于早期的 URL 只有 ASCII 字符,所以无需编码。
但世界上有多种语言,为了让 URL 符合语义标准,必须转码,主要有以下几种字符需要编码:
- ASCII 控制字符。
- Non-ASCII,比如中文字符。
- 保留字符,比如/符号有特殊含义,为了输出原始/符号,必须编码。
- 不安全字符,这些字符(比如<、\、%)应该可以称为“应用字符”,对应的就是 HTML 中的“实体字符”。
那么具体如何编码呢?
- 非字母和数字字符替换为%符号,后面跟着字符的十六进制。
- 破折号、下划线、点号和波浪号无需编码。
- 空格替换为%20。
接着说说urlencode,它基于rawurlencode标准,但有略微的不同,它定义在rfc1866,这个rfc属于html标准的一部分,编码方式和 application/x-www-form-urlencoded MIME 编码方式一致。
urlencode处理 query string 的编码,而 rawurlencode 被认为处理 url 编码,这可以看做一个区别。
urlencode 和 rawurlencode 在编码方式上有二处区别:
- 波浪号需要百分号编码。
- 空格替换为+。
那么为什么不能保持一致呢?可能是历史原因,但 rfc2396 认为 url 中的 + 符号是一个保留字符,所以 rawurlencode 编码方式更标准。
在具体写代码的时候,其实很少接触到 urlencode 编码,因为浏览器,web服务器,代码框架都做了封装,比如 web 服务器会自动urlencode, curl 库也会自动urlencode query string。
那为什么今天提到 rawurlencode 呢,我在使用阿里云和腾讯云API的时候,在对API签名的时候,会对各个 query string 进行 rawurlencode,然后再计算前面,至于为什么不直接使用 urlencode,是我非常好奇的。
类似文章:
![](https://img.haomeiwen.com/i234392/14d6e5c47c71ccf4.png)
网友评论