oynix

于无声处听惊雷,于无色处见繁花

URL编码与解码

这几天接触了很多的网址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
2
3
echo -n '&' | xxd -plain

> 26

在ASCII中,&对应的16进制是0x26,其中,-n是为了去掉echo默认输出的回车符。

  • 编码

    1
    2
    3
    echo -n '你好' | xxd -plain | sed 's/\(..\)/%\1/g'

    > %e4%bd%a0%e5%a5%bd

    其中,sed的command表示每隔两个字符,添加一个百分号

  • 解码
    解码的过程,将每个%和两个十六进制数字的形式,转换成\x加两个十六进制数字的形式,然后,使用printf命令就可以输出

    1
    2
    3
    printf $(echo -n '%e4%bd%a0%e5%a5%bd' | sed 's/\(%\)\([0-9a-fA-F]\{2\}\)/\\x\2/g')

    > 你好
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2022/05/c8402f1ad2bc/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道