编码 encode

不久前对接一个小项目时,涉及开放接口给外部调用,为了安全起见外放接口进行了验签校验。
验签生成方式比较老套:
1、参数列表按照key正序排列 L1
2、按照 L1 顺序取出key 对应 value UTF-8编码后 拼接成字符串 S1
3、己方分配的Token拼接S1生成新字符串S2
4、验签 sign = md5(S2)
初看没发现问题,编码过程中越想越不对劲:
如何保证己方获取到的参数解码正确?
对于该问题 想到规定调用方参数统一UTF-8,己方接受后统一UTF-8解码即可。(方法是否待优化暂且不提)然后思考如何从请求发送方开始梳理下编码解码的过程,发现没能完全梳理清楚,遂查询资料,记录下。
一、为何需要编码?(Why)
计算机基本的存储单元字节 (byte),即8个bit,因此能表示的范围是 0~255个。但是光常用的汉字都不只256个,更别说其他语言,其他符号了。任何一个符号或者任何一个汉字都用字符(char)来表示,那么最终存储还是要转换成byte,char 变成 byte就是编码的过程。
所以为啥需要编码,一是byte表示信息有限,二是人类要表示的char太多。
二、怎么编码?(How)
既然要编码,那怎么编码呢?
其实跳出来看的话,编码无非就是一个约定的规则,或者说一个字典集合。既然是字典,那世界上字典就有点数不过来了。
中文有新华字典(可以理解成GB2312),新华字典又有众多版本(后来的GBK,GB18030);
英文虽然世界上很多国家用,并且各个国家都有一些本国使用的词语,但是牛津词典(unicode)包括了所有英文国家的词语-- 世界上所有语言都可以通过它互相翻译,为啥可以做到呢,他厚嘛(复杂)。如果说unicode 是本大字典的话,那么UTF-16和 UTF-8 就是讲怎么把这个大字典存到计算机(小芯片)里头,随身携带多方便。不同得是,UTF-16 由于自身存储空间大,要求所有字符都得是两个字节,但其实常用的很多字符完全不需要,因此出来了变长的UTF-8。
网上看到话挺好:
链接:https://www.zhihu.com/question/23374078/answer/69732605

你可能感兴趣的:(编码 encode)