相信不少同学都在初学计算机之时,都被ASCII,Unicode和UFT-8等字符编码格式 搞得焦头烂额,这玩意儿到底是啥,区别是啥,为啥有这么多?
反正我刚学的时候纯粹是囫囵吞枣,为了考试潦草背一背,背后的各种问题都没有考虑,直到最近,有人问我为什么有了Unicode还要有UTF-8,我一时语塞,羞赧之余才有了今天的这篇算是入门的文章。
首先我们看一下ASCII编码,我们先不解释ASCII,先从计算机的存储来看。
众所周知,所有的信息对计算机来说都只是0和1,就像对于人类来说,所有的信息最终都会转换成对于文字的描述,对于计算机而言,0和1就是他全部的语言,这就是所说的二进制。
每个二进制位有0和1两种状态。最近大热的量子计算机,也无非使用用两个量子态│0>和│1>代替经典比特状态0和1,它的基本信息单位就不是比特了,而是量子比特。
对于一个比特而言,有0和1两种状态,而1个字节由8个比特组成,也就是有256种状态,从00000000到11111111,每个状态对应一个符号,就能表示256个符号,我们知道,计算机起源于美国,所以对于英语为母语的美国人来说,256个字符绰绰有余。因此,能表示256个字符的ASCII码一开始仅仅使用了128个,即把一个字节第一位的比特都取为0。
但是,计算机的浪潮席卷全球,美国人用的那套就行不通了,一开始是欧洲的一些国家,128个字符压根不够,所以他们把第一位的比特也拿出来,但这也只能表示258个符号,更重要的是,每个国家都是用了258个符号的字符编码没事,但是代表的字母却不一样了,这就相当于两个地区的方言。
比如我的老家问你喝了吗?意思是喝没喝水或者粥一类的东西,但是隔壁市问你喝了吗就是问你吃饭没有的意思,让这两个碰上面,肯定会造成沟通上的失误,也就是我们所说的无法有效传递信息。
因此,为了解决这个问题。Unicode出现了,它把所有的符号都纳入其中。
但是需要注意的是,Unicode只是一个符号集,还是要依赖于具体实现,也就是应该如何存储,原因是如果规定字符都使用一两个字节,那汉字就不能表示,但是都是用三四个字节,英文字母就会浪费很多内存空间,因此这就依赖于UTF家族成员,UTF家族有UTF-8,UFT-16以及UTF-32这几个成员。
UTF-8有一个很大的好处,就是它可以根据不同的符号来变化长度,这样就可以避免英文字母造成内存浪费的问题。
当然,UTF-8的编码规则也很简单:
1)对于单字节的符号,字节的第一位都为0,后面7位为这个符号的Unicode,这一点和ASCII编码是一样的。
2)对于n字节的符号,第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码。这也就意味着,如果第一位为1,那么有多少位1,就表示当前字符占用了多少个字节。
Little endian和Big endian:
Little endian:小字节序,也叫低字节序。意思是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
Big endian:大字节序,也叫高字节序。意思是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
那么问题来了,何为字节序呢?
通俗来说,字节序就是指数据在内存中的存放顺序。
例如”子“,它的Unicode编码是 5b50 ,需要用到两个字节存储,一个字节是5b,一个是50。存储的时候,5b在前,50在后,就是Big endian方式,倒过来就是Little endian方式。
今天的分享就到这里了,如果大家有什么问题,可以发在留言区。
感谢大家的观看。