首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

详解base64和latin1的编码原理

由来

前端最早认识base64编码应该是从将图片转化为base64字符串应用在web中了解到的,当时我们都是用一些工具自动转化,所以不了解它的原理也不妨碍使用。那这种编码方式是如何产生的呢?传说当年电子邮件刚登场的时候,只能传送英文世界的字符,而对中文等一众字符支持的不好,如果我们把支持不好的字符转化为英文字符岂不是就可以解决这个问题,这种背景下就诞生了base64编码方式,当然后来base64的应用逐渐被发扬光大!

索引

字面里面有个64,64表明有64个字符,有哪64个字符呢?如下:

demo1

demo1是base64索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。

另外需要注意:base64是把二进制转化为字符串,也就是demo1中的字符串,再多加一个“=”号。

原理

首先我们明确几点:

我们用6位二进制刚刚好可以对应64种字符

一个字节有8位

字符转化为二进制都是以8位二进制为单位的,无论是码点、utf8还是utf16

当只有1个字节(8位)或者2个字节(16位)的二进制是不能被6整分的,但是3个字节(18位)悄悄可以被6分为4个部分,即每一部分(6位)都可以对应到demo1索引表中的1个字符,所以以此得出二进制转化为base64是以3个字节为一组的。

当二进制数据不是3个字节(24位)的倍数怎么办?

剩余1个字节(8位),补充4个0,此时一共12位可以对应demo1索引表中2个字符,剩余12位为空,在索引表中没有对应的字符,用两个“=”代替

剩余2个字节(16位),补充2个0,此时一共18位可以对应demo1索引表中3个字符,剩余6位为空,在索引表中没有对应的字符,用一个“=”代替

举例

demo2

A对应二进制是01000001,一个字节,符合上面说的第一种情况,补充四个0,前面12位对应字符“QQ”,后面12位是空,用“==”代替,最后结果是“QQ==”;

BC是2个英文字符,两个字节,符合上面说的第二种情况,补充两个0,前面18位对应字符“QKM”,后面6位是空,用“=”代替,最后结果是“QKM=”;

推论

根据base64的特点,我们大胆推论一下!我们能不能开发下面几种编码方式:

base128,可以用7位二进制表示,7和8的最小公倍数是56,感觉太大了不太合适;

base32,可以用5位二进制表示,5和8的最小公倍数是40,也是太大了不太合适;

base16,可以用4位二进制表示,感觉太小了

所以综合来看还是base64最合适!

如果我们把一个字节的8位都用上呢?有没有这样的编码?有,它就是latin1!

latin1

latin1又名ISO-8859-1,编码表如下:

demo3

一共256个字符!这就是传说中的单字节编码,mysql选它做默认的编码方式,那么mysql为什么选它做默认编码方式,而不是其他的编码方式呢?

细想一下:

字符串转化为二进制,肯定都是以字节为单位的(8的倍数),所以无论存储什么字符串都能将其完整的对应到demo3的索引表中,读取时可能会乱码,但至少保证了数据的完整性。其他的编码方式显然不具备单字节编码的这种优势,有可能造成数据丢失!

总结

这篇文章主要聊了两种编码方式,base64是我们常见的编码方式,latin1虽然不常见但是可以了解一下!

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191120A03I3E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券