36

urlencode和rawurlencode,傻傻分不清

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAwOTU4NzM5Ng%3D%3D&%3Bmid=2455770712&%3Bidx=1&%3Bsn=71af31e34bdcc06767054419db3d5cc4&%3Butm_source=tuicool&%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近半年我写了很多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,是我非常好奇的。

类似文章:

aYbieiq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK