urlencode和rawurlencode,傻傻分不清

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

类似文章:

  • 浏览器下载中文名文件出现乱码,如何解决?
  • 你真的知道网页上传文件背后的原理吗?
urlencode和rawurlencode,傻傻分不清_第1张图片
扫码_搜索联合传播样式-标准色版.png

你可能感兴趣的:(urlencode和rawurlencode,傻傻分不清)