背景
首先要知道,有一个最小单位为 位
,也就是常说的 bit
。一个 bit
,值只能为1或0。一个字节,由八个位组成,即1 byte = 8 bit。因为一个字节由8个位组成,比如 1010 0101 ,所以显然一个字节能表示的最大的数就是8位全为1,即 1111 1111(二进制)。转为10进制,也就是255。想表示更大的数,就需要多个字节拼起来,比如两个字节拼起来的最大数为 1111 1111 1111 1111,对应的十进制是65535。计算机上要显示的文字内容,有很多,比如abcd,1234,+-*/等等,这些每一个字符,都是跟一个数字对应起来的,形成了一个字典,这个字典就是编码规则。
ASCII
计算机是美国人发明的,那个时候,需要在计算机上显示的字符,内容构成很简单的,只包含了所有大小写字母,数字,和一些常用符号,总计有127个字符。这样的话字符只要用一个字节表示就够了。比如65对应A,z对应122。这个对应关系,便被称为 ASCII
编码。
GB2312等等
后来,随着计算机的普及,世界各国的人都开始使用计算机了。中国人要在计算机上显示中文,日本人要在计算机上显示日文,诸如此类,世界上有很多语言的文字都需要显示,然而计算机当前只能显示127个基本字符,这显然是远远不够的。因此,各国开始搞自己的编码了。因为新的字符实在太多了,而一个字节显然不够,所以新的编码格式,比如中国的 GB2312
,就是用至少两个字节来表示一个字符。类似的,日本人有自己的 Shift_JIS
编码,韩国人有 Euc-kr
。这时的编码就很乱了。
Unicode
因为类似 GB2312
一样的各种编码互相冲突,所以又出现了一种新的编码方式 Unicode
,来将所有的编码统一处理,这样不管你用什么国家的语言,只要用我 Unicode
,那都可以显示出来。在 Unicode
编码中,一个字符通常由两个字节组成(除非一些非常偏僻的字符 会多一点)。
UTF-8
虽然 Unicode
很通用,但是有一些冗余的情况。为什么呢?比如一个大写字母A,他之前在 ASCII
下对应65,二进制也就是0100 0001,在 Unicode
编码中,只要在前面补一个0字节即可,即他对应为0000 0000 0100 0001。这样问题来了,之前 ASCII
定义的这些字符在 Unicode
中,都在前面白白加了8个0,这样在传输时多浪费空间啊。所以,由 Unicode
演化出一种新的编码, UTF-8
。在 UTF-8
中,不同的字符对应的字节数也不同。常见的英文字母等 ASCII
“元老”,只用一个字节表示。而像中文字符这样的,一般用三个字节表示。
now
现在,因为 Unicode
编码占用空间多,所以在传输或存储时都使用了 UTF-8
编码,而在计算机内存中使用时,则使用着 Unicode
编码。比如我们在写代码的时候,在IDE中写入文件的代码,都是用 UTF-8
编码格式保存起来的。在编译运行时,这些字符被读取到内存中,此时用的编码格式则是 Unicode
。