编码Ascii;unicode; utf-8;utf-16;utf-32;gb2312;gbk

butterflyfly00 2019-06-25

自用

1bit=0/1 1个位数表示两种组合;
1byte(字节) = 00000000 8个位数共256种组合对应十进制0-255;

Ascii编码 0-127编码;由于1byte最多只有256种可能,当中国开始使用计算机的时候,已经没有可用编码;
所以出现了gb2312;和gbk

gb2312编码 采用两个字节表示,(高字节)xxxxxxxx xxxxxxxx(低字节),两个字节都大于127;高字节从0xA1到0xF7(161-247),低字节从0xA1到0xFE(161-254)共8091种组合;然而8000多种组合并不能满足大天朝的要求;所以后面有出了gbk编码

gbk编码 采用两个字节表示, (高字节) xxxxxxxx xxxxxxxx (低字节),此时并不要求低字节大于127,所以又增加了20000多种组合。

然而如果每个地区都有一套类似中国的编码,那么可以想象,做一个国际性的网站会有多艰难,编码标准也会被打乱。

所以救星unicode编码来了;

unicode编码 最初的unicode编码用两个字节表示一个字符。共65565种组合,可以基本满足需求,然而像英文字符
等unicode编码的高字节都是0,这对于存储时莫大的浪费,所以出现了utf-8;

Unicode的问题

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。
utf是unicode的实现方式

utf-16编码 用两个字节表示字符,容易与unicode编码混淆。UTF-16编码以16位无符号整数为单位。注意是16位为一个单位,不表示一个字符就只有16位。现在机器上的unicode编码一般指的就是UTF-16。绝大部分2个字节就够了,但是不能绝对的说所有字符都是2个字节。这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也可能是4个字节。

utf-8编码 用1-4个字节表示字符,0xxxxxxx, 110xxxxx 10xxxxxx,1110xxxx 10xxxxxx 10xxxxxx

编码Ascii;unicode; utf-8;utf-16;utf-32;gb2312;gbk

例:
中文‘汉’字
对应的unicode是6C49这是用十六进制表示,用十进制表示是27721;
对应的utf-16编码为01101100 01001001
对应的utf-8编码为1110xxxx 10xxxxxx 10xxxxxx x用二进制填满
也就是11100110 10110001 10001001(E6 B1 89)

相关推荐