ASCII GBK UNICODE
对于计算机来说,只会识别机器码0101这样的东西,如何才能让他输出我们需要的字母、数字、汉字等内容呢?这就需要用到编码。
先说说字节,字节是计算机存储的最小单位,1个字节代表计算机的8位0101xxxx这样的空间,因为每一位有0和1两种选择,因此,一个字节最多能表示的8位序号有2的8次方即256种。
对于ASCII编码来讲,它可以把字母、数字、一些符号通过0101的形式编好序号,因为这些字母数字等最多不超过128种,因此一个字节就可以把这些字母数字都编好序号。
比如字母a的编号为0 110 0001,当计算机识别到这串编号,就可以通过显示器把它通过ASCII找到对应的a并输出。
同样的,GBK是在ASCII上增加了汉字的一种编码,因为汉字比较多,1个字节无法满足编号要求,2个字节即2的16次方(65536)种编号才够使用。
UNICODE则是对全世界所有语言进行编号,目前有两种,一种是UCS2即2个字节表示,另一种是UCS4是4个字节表示(比UCS2多了一些特殊的元素如各种表情等),现在unicode一般指的是UCS4。
UTF-8
UTF即Unicode Transform Format 是UNICODE的一种转换形式,-8表示最少为8位进行表示,utf-8是一种可变长度的编码。具体什么含义呢?
比如说,你要表示一个字母,8位就可以表示,如果用没转换过的Unicode进行编码,假如是UCS4就需要4个字节32位表示,那么前面24位就都是0,这样其实浪费了3个字节的空间。所以UTF-8对UCS4压缩后,英文占用1个字节,中文占3个字节。
因此,在网络上传输时,一般都是通过utf-8进行传输,既能保证世界范围内通用,又可以节省空间。当然,如果是中文环境的话,因为中文2个字节就可以表示完,使用utf-16或者GBK一般会更省空间。比如“我爱你!”,3者占用:
使用gbk,占用32+1=7个字节;
使用utf-8,占用33+1=10个字节;
使用utf-16,占用4*2=8个字节。
乱码
了解了上面的编码内容,就很容易可以理解出现乱码的原因,就是编码与解码的方式不一致导致的。