Base64 编码与 URL 编码介绍

Base64编码

首先看一个例子,在终端中使用Base64工具对字符串”mkbk”进行编码,得到以下输出:

1
2
root@Debian:~# echo -n "mkbk" | base64
bWtiaw==

注意:echo命令的-n参数用于去除echo命令自动添加的换行符。也可以用printf命令代替echo -n命令。

编码过程如下:

  1. 根据ASCII编码表将每个字符转换成对应的十进制,得到以下结果:
m k b k
109 107 98 107

注意:在终端中查看ascii编码表可以用ascii -d命令,如果命令不存在,可以使用sudo apt install ascii安装。

  1. 将每个十进制数转换成八位二进制数,得到以下结果:
109 107 98 107
01101101 01101011 01111010 01101011
  1. 将二进制数按照6位一组进行分组,不足6位的在末尾补0,得到以下结果:
011011 010110 101101 111010 011010 110000
  1. 将每组二进制数转换成对应的十进制,得到以下结果:
011011 010110 101101 111010 011010 110000
27 16 45 58 26 48
  1. 按照Base64编码表将每个十进制数转换成对应的字符,得到以下结果:
b W t i a W

注意:Base64编码表中的字符包括字母A~Z、a~z、数字0~9、+和/,共64(0~63)个字符。

  1. 如果分组后的字符数不是4的倍数,则在末尾添加=字符,直到字符数是4的倍数,得到以下结果:
bWti aW==
  1. 最后将分组后的字符拼接起来,得到最终结果:

bWtiaW==

URL编码

根据RFC 1738的规定:在HTTP请求时,必须对保留字符进行URL编码,而未保留字符无需编码。

保留字符是指容易造成歧义的特殊字符,比如正斜杠(/)用于分隔URL中的路径,如果不对它进行编码,那么浏览器可能会将其误认为是路径分隔符,导致URL无法正确解析。

保留字符有以下这些:

alt text

未保留字符如下:

alt text

注意:保留字符和未保留字符之外的字符一律需要进行URL编码。比如汉字、法语等。

URL编码的规则是,将字符的ASCII的值表示为两个16进制的数字,然后在其前面放置一个转义字符(%),再替换回URL中的相应位置。(对于非ASCII字符,需要转换为UTF-8字节序,然后每个字节按照上述方式表示。)例如,空格的ASCII值为32,URL编码之后为%20(20是32的十六进制值)​。

注意:百分号单独使用时需要用%25(25是%的十六进制值)来表示,否则百分号会被当做转义字符。

下面用一个例子来说明URL编码的必要性,使用cURL工具对 https://cn.bing.com/search?q=几点了这个URL进行请求,得到以下结果:

alt text

可以看到服务端返回了400状态码,说明请求未被服务端理解。将URL中的汉字进行编码后再次执行请求,得到以下结果:

alt text

服务端返回了200状态码,说明请求ok了。

参考

https://zh.wikipedia.org/wiki/Base64
https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81