几张图看懂Unicode和UTF-8

开发者 2024-9-17 22:25:22 87 0 来自 中国
二进制

为什么要编码? 在盘算机中,所有的数据在存储和运算时都要使用二进制数表现(由于盘算机用高电平和低电中分别表现1和0)
我们用QQ给其他人发消息、发文件、发心情,终极会以二进制形式在网路中传输,到达后再转换返来
1.png 本地存储也一样,终极都是以二进制形式存储在盘算机中
ASCII

标题来了,A电脑想给B电脑传送一个"a",假如转换的二进制是"110",那么B怎么知道这个二进制代表的是"a"呐
标题重要缘故原由是各人没有共识,就像甲地区110代表"a",到了乙地区110代表"b",两个地区就没办法正常互换
为了办理这个标题,一个叫尺度化构造的单元(ISO)出头了:由我们来订定每个字母和二进制的对照关系,各人都按我这个对照关系转换即可(由于最早盘算机是美国人玩的,以是须要创建对照关系的也就是英笔墨母和一些特殊字符),这个由ISO订定的对照关系就是ASCII编码,可以明白为给每个字符设置了一个唯一的ID
由于有了ASCII编码,各人就有了共识,相互沟通再无停滞
Unicode

厥后期间再发展,越来越多的国家开始用盘算机了,这时ASCII码就不敷用了,好比“大”在ASCII码中找不到对应的二进制啊,那应该编多少?
为了办理这个标题,ISO又出头了,扩展对照关系,把天下上所有的语言的字符都到场到这个新对照关系,并重新定名为Unicode码,又叫万国码,霸气~
可以发现二进制的位数变长了,由于原来ASCII字符少,如今把天下的字符都加上就越来越长了
实现

标题又来了,以上的图片每次都是只发送一个字符“a”和 “我”,但实际中我们通报信息肯定都是许多字符构成的句子,好比如今我们发"0a"两个字符,此中0的二进制是110000,a的二进制是1100001,假如发出去合起来就是1100001000001,这时间读法就故意思了,差异的断句读的效果就不一样
好比向后错开一位读取效果就酿成了"a!"
5.png 像极了了《九品芝麻官》里的搞笑状纸:

  • 收回黄公年租银两三十,万不能转租别人
  • 收回黄公年租银两三十万,不能转租别人
以是,光有共识的编码规则并不敷,还要真正的实现方式(怎么找到字符和字符的界限),最简单的实现方法就是固定每个字符的二进制长度,不敷的前面补零,早期的ASCII码8位二进制足以表现,以是就8位代表一个字符,这8位被称作一个字节,这是ASCII编码的早期实现
那么发展到如今,ASCII不敷用了,改用Unicode,最大16位足以标识,可以用两个字节即16位代表一个字符,天然也不会出现断句错误标题,这就是Unicode的最简单实现方式,这种实现方式叫UTF-16
UTF-8

UTF-16可以正常举行网络互换信息,但有个致命的缺点:好比要发送一个阿拉伯数字"1","1"的Unicode码位是110001,6位二进制充足了,确由于要填满16位而在前面填充了10个0,这真是对网络和存储空间极大的浪费
于是,一种更为公道的Unicode编码实现方式UTF-8被广泛使用
UTF-8为什么更加公道?它的核心头脑很简单:当字符Unicode码位小的时间少占用字节,码位大时多占字节
这个头脑很简单,落地还是有标题要办理的,好比一个电脑继承到了多个字节,怎么知道某一个字节是一个字符,还是这个一个字节和下一个字节共同构成一个字符,假如没有一种方法去标识,还是会产生阅读误区
UTF-8的办理方案如下,界说了一套规则:

  • 假如是单字节代表一个字符,首位是0(控制位),剩余位是Unicode码(剩余7位),因此Unicode码位是7位以下的字符(编码十进制0 ~ 127)就可以用单字节传输,好比英笔墨符都符合7位以下,因此在utf-8中,英笔墨符占一个字节
由于英文占逐一个字节,使得UTF-8可以完美兼容ASCII,这也是它被用的最广泛的缘故原由

  • 假如是n字节代表一个字符,第一个字节n个1一个0开头作为控制位,别的字节以10开头作为控制位,所有字节的剩余位数归并代表Unicode值
    双字节如下:


    此中玄色XXX存放的是Unicode,统共剩余共11位,11位最大值就是2047,以是127-2047码位的字符用占两个字节。
    三字节如下:


    总剩余位16(最大65535),所2048-65535的字符占三个字节,汉字的Unicode在这个范围之中,以是如今懂为什么UTF-8的汉字占三个字节了吧~
13.png GBK

由于讲了UTF-8,也不得不提一句GBK了,GBK是与Unicode共存的国产编码方式,全称是《汉字内码扩展规范》,它是我们自己国家界说的字符和二进制的逻辑映射(同一个汉字的Unicode和GBK的码位是差异的),而它的实现方式就比力固定了,用两个字节来代表一个字符

  • Unicode是从数字和字符之间的逻辑映射的概念编码,实现方式一样寻常使用UTF-8这种可变字节的实现方式来制止浪费,也可以使用UTF-16用固定两个字节代表一个字符,另有别的实现方式如UTF-32
  • GBK编码体系可分为逻辑映射和实现方式两个条理,实现方式由于大部门是汉字以是固定两个字节代表一个字符,够用也不会有太多浪费
以是要说UTF-8和GBK到底谁好,也得分环境,假如大部门字符都是汉字,GBK两字节显着更节省空间(UTF-8由于要留控制位以是汉字须要三个字节),但假如大部门是英文显然UTF-8更节省,再有一点UTF-8实际存储的还是Unicode编码,环球都认,GBK属于国产编码,传送到国外还须要翻译,以是考虑国际化UTF-8还要更胜一筹
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 00:21, Processed in 0.189843 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表