对ASCII、GB2312、Unicode、UTF-8的理解

ASCII:美国标准信息交换代码,用一个字节来表示,每个数字对应一个字符,类似于对应表,操作系统根据数字来显示对应的字符,美国只用了0-127

GB2312:由于汉字太多了,一个字节不够用,咱们就学ASCII自己定了一套编码库,收录了咱们常用的汉字和部分其他文字

Unicode:世界上还有很多国家民族也要在计算机中显示自己的文字,于是大家就各自弄了一套自己的字符集,比如中国大陆的GB2312,这样的话,冲突在所难免,所以国际上就弄了个统一的Unicode,把所有的文字包括进去并且保证不冲突,Unicode本质上也是一个对应表,最开始是2个字节,最多表示65536个字符,范围0x00-0xFFFF,后来进行了扩展,变成了0x00-0x10FFFF,现在能表示17*65536=1114112个字符,基本上把世界上所有的文字都包括进去了

UTF-8:Unicode的范围是0-1114112,这就出现一个问题,英文字母由于比较少再加上计算机起源美国,所以美国人一般只用到0-127,0-127用一个字节就能表示,而汉字由于比较多,再加上很多繁体字生僻字编码比较靠后,很多都是3字节甚至4个字节,当我们保存Unicode字符集的字符串数据时,就要考虑用几个字节来表示,如果用1个字节的话,汉字就没法保存了,如果用4个字节的话,英文就大大的浪费了,所以UTF-8就出现了,它则是基于Unicode字符集的一种编码实现,大致思路是在二进制位中标记共有几个字节,并将原Unicode的字节填充进去,这样就能用一个字节来保存英文字母和数字,用3-4个字节来保存中文了,规则如下:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码

最终的UTF-8模型如下,其中x用来填充Unicode码,首字节开头的1用来标记有几个字节,0后面的是数据,非首字节开头用10来标记,后面也是数据

1个字节,则0xxx xxxx
2个字节,则110x xxxx 10xx xxxx
3个字节,则1110 xxxx 10xx xxxx 10xx xxxx
4个字节,则1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx

将UTF-8中除x外的固定位移除再连接起来就是Unicode码了

GBK:GBK是GB2312的扩展,GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物

GB18030:对GB23120完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位

UTF-16:Unicode的另一种编码方式,不过不常用

--------------个人的粗浅理解,可能有不准确的地方---------------

原文地址:https://www.cnblogs.com/luludongxu/p/13848175.html