今天用fiddler抓包,抓到某个应用的一个api链接,于是想自己操作一下.输入"加多宝",结果拿到如下的request请求

GET /search?requery=0&sort=default&page=1&q=%E5%8A%A0%E5%A4%9A%E5%AE%9D&list_id=I2D9i2Tn&size=20&pdduid= HTTP/1.1


那不用说q=%E5%8A%A0%E5%A4%9A%E5%AE%9D这一串应该代表的是"q=加多宝"了.

我去网上工具里查了一下加多宝的编码,发现怎么都对不上.比如输入中文转成Unicode后是\u52a0\u591a\u5b9d,而转换为UTF8是加多宝,只有使用Url编码时显示的才是正确的%e5%8a%a0%e5%a4%9a%e5%ae%9d.


为什么会这样呢,那么字符转换的原理是什么呢.

先从Url编码入手,度了一下urlencode,看到里面的原理中说"将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。"那看来上面的一串应该反转一次去掉%,结果是'e58aa0e5a49ae5ae9d',以16进制来观察,第两位代表一个字节,那全长是9个字节,应该是4.5个unicode字符???

所以这个解释是说不通的,再查查,发现了这个文档中说"对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。".

结果明确了,那个9字节串应该很可能是三个中文字的utf8编码,那么我们看一下如何将中文编成utf8编码,以"加"字为例子.

首先查找"加"的unicode,没错,就是52a0.

然后将它转换成二进制,是0101 0010 1010 0000,将最左边的1前面的0位去掉,发现共有15位.

那如何写成UFTF8编码呢,其实很简单,从右往左先取6位, 如果不足或还剩下1位的话,那直接在前面补0形成一个字节就可以了.否则的话,第六位前补'10'这两位形成一个8位字节,剩下的不足6位的部分前先补个0,剩下的用1补足8位.

补起来后的结果是

1110 0101 1000 1010 1010 0000

算成十六进制就是

E5 8A A0

完活

   unicode urlencode utf8
  最后修订:2018-4-1

0条评论