大家都知道计算机只能处理数字,所以在计算机中其他字符都需要先转换为数字0和1才能处理。每8个bit作为一个字节,一个比特位表示一个一个字符,一个字节就能表示255个字符。
而一个字节足以表示所有的美国字符,所以美国人编写了自己的ASCII编码,作为自己的统一编码。但是汉字不止255个,所以中国用两个字节表示一个汉字,编写了Gb2312编码作为自己的统一编码。同理,日本韩国等国家也都编写了自己的标准编码。但是各国的编码标准不同,统一显示就会出现乱码。
由此,Unicode编码产生了,将所有语言统一到一套编码里。
但是Unicode的编码占用的内存比较大,举个例子。汉字“中”的Unicode编码是两个字节即16个比特位,而英文字母只有一个字节即8个比特位,所以Unicode在表示ASCII编码的英文字符时会在ASCII编码的基础上在编码前加上8个0.。所以Unicode编码会比ASCII编码多需要一倍的内存空间,传输时也同样要多传输一倍的量。
看上去比ASCII编码多需要一倍的空间,怎么办?将Unicode编码转换为可变长度的utf-8(后面为了方便会直接写成utf8)编码。utf8将用一个字节表示英文字符,用三个字节表示中文,比较偏僻的中文会用4-6个字节表示,如果需要传输大量的英文,utf8的作用就非常明显了。
那么问题又来了,如果计算机内部处理的是utf8的可变长编码,就相对来说比较复杂了,毕竟是不定长的,不如处理定长的Unicode编码方便快捷。所以计算机内部处理编码时会牵扯到Unicode和utf8的转换。怎么说呢?计算机得到一串utf8编码的字符,会先将其转换为Unicode编码的字符,处理完了会再将其转换为utf8编码的字符进行输出。如下图:
本文学习自imooc,错误理解之处望加指正。