这几天接触了很多的网址URL,形形色色的URL,其中多数都掺杂着%,之前只是知道这是转码,因为有些符号不能直接在URL里展示,这次学习了一下。
1. 引题
我们都知道,URL是可以传参数的,比如
1 | https://www.google.com/search?q=tom&ie=UTF-8 |
像上面这样,通过Google搜索关键词tom时,就会访问这样一个URL,通过URL向Google传递了2个参数,一个是q一个是ie,通过&符号连接,Google在收到请求,解析的时候,也会通过&符号切割,并读取q和ie的值。
同理,当要搜索tom&jerry时,对应的URL应该是这个样子
1 | https://www.google.com/search?q=tom&jerry&ie=UTF-8 |
但是,Google在解析的时候,就会出问题,无法正确解析。这个时候就需要对URL进行编码,将&转换成%26,Google收到请求后,会先对URL解码,这样一来就不会出问题
1 | https://www.google.com/search?q=tom%26jerry&ie=UTF-8 |
2. 编码和解码
简单说,就是将其转换成16进制的形式,然后再用百分号%分隔。
shell中的xxd命令,可将数据转换成16进制形式,通过shell中的xxd命令操作,如下
1 | echo -n '&' | xxd -plain |
在ASCII中,&对应的16进制是0x26,其中,-n是为了去掉echo默认输出的回车符。
编码
1
2
3echo -n '你好' | xxd -plain | sed 's/\(..\)/%\1/g'
%e4%bd%a0%e5%a5%bd其中,sed的command表示每隔两个字符,添加一个百分号
解码
解码的过程,将每个%和两个十六进制数字的形式,转换成\x加两个十六进制数字的形式,然后,使用printf命令就可以输出1
2
3printf $(echo -n '%e4%bd%a0%e5%a5%bd' | sed 's/\(%\)\([0-9a-fA-F]\{2\}\)/\\x\2/g')
你好