字符编码讲解:ASCII、GB2312、GBK、Unicode、UTF-8关系

ASCII

标准的ACSII码是用一个字节中的7个二进制位,最高位0或者作为校验位,可以表示2^7即0000 0000~0111 1111 共128个字符。
扩展的ASCII码当欧洲国家使用时128个符号是不够的,于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号,用满了一个字节的8个二进制位,可以表示2^8即256个字符

GB2312

当中国也开始使用计算机的时候,因为中国文化博大精深,象形文字多啊,256个字符哪里能够表示出我国那数以万计的中国字呢,于是中国这个时候就需要设计一个能代表中国汉字的编码表。
于是中国国家标准总局1980年发布了《信息交换用汉字编码字符集》一套中国的字符编码标准,也就是GB 2312—1980。不用八位,用十六位表示一个字符也就是说一个中文汉字占两个字节。
GB2312字符集共收入汉字6763个和非汉字图形字符682个。
整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉 字进行编码,称为区位码。

简单点来说的话就是把6763个字符分成94个班级,然后每个字符在哪个班级几排几列就是字符所占据的位置,打比方说你在63班第七排第五列,那么你就是6375就是你占据的位置,我就能通过6375从而找到你

GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

  • 01-09区为特殊符号。
  • 16-55区为一级汉字共收录了3755个,按拼音排序。
  • 56-87区为二级汉字共收录了3008,按部首/笔画排序。
  • 10-15区及88-94区没有使用则未有编码。

举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
现在我们有每个字节的码位,但是我们还没有规定改怎么存储
如:ASCII码是直接将ASCII的码位转换成二进制存储
那么GB2312是怎么存储的呢,我们拿“帅”字来做示例
帅在GB2312字符集的码位是4307,我们

第一步:将4307的前两位跟后两位分开得到43,07
第二步:将43,07转换成16进制得到0x2B,0x07
第三步:将0x2B,0x07都加上0xA0得到0xCB,0xA7
最后CBA7就是"帅"的GB2312码

在这里插入图片描述
至于为什么会加上A0,因为加上A0后的GB2312码,高八位和第八位都是大于127
如何让计算机正确的区分ASCII码和GB23212码
:通过判断字符的大小,如果小于127就表示ASCII码
:如果碰到两个大于127的八位,就代表两个组成一个的GB2312码

GBK

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。

GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。
GBK也就是在后来发现中国的汉字实在是太多了,GB2312不能全部的表示中国的汉字,于是对GB2312进行了扩充,他把之前空闲的区使用上了,并且不在规定低八位要大于127,只要保证高八位是大于127的就表示一个汉字的开始,新增了近2000个汉字跟符号

GB18030

对GB 2312-1980完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位。GB 18030共收录汉字70,244个。新增了几千个少数名族的字符

Unicode(万国码)

每个国家都拥有一个自己的编码规则,世界上就存在着多种编码方式,那么当国家之间进行信息交流的时候就会出现乱码的情况,就比如最常见的就是你的中文有时候打开的时候你发现变成了一堆的乱码,这个就是编码方式的问题。
于是人们就想:我们能不能定义一个超大的字符集,它可以容纳全世界所有的文字字符,再对它们统一进行编码,让每一个字符都对应一个不同的编码值,从而就不会再有乱码了。
于是诞生了Unicode 「字符集」
而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。
UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。共有65536个字符,但是并不能表示全球所有的文字
为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。可以表示进43亿个字符
UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。
Unicode 字符百科

UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。

UTF-8的编码规则:

(1) 对于ASCII码中的符号,使用单字节编码,其编码值与ASCII值相同(详见:U0000.pdf)。其中ASCII值的范围为0~0x7F,所有编码的二进制值中第一位为0(这个正好可以用来区分单字节编码和多字节编码)。

(2) 其它字符用多个字节来编码(假设用N个字节),多字节编码需满足:第一个字节的前N位都为1,第N+1位为0,后面N-1 个字节的前两位都为10,这N个字节中其余位全部用来存储Unicode中的码位值。
在这里插入图片描述
举个例子:

第一步:“帅”这个字在Unicode字符集是U+5E05 :0x0000 5E05 Unicode 字符百科
第二步: 将0x0000 5E05转换成二进制:0000 0000 0000 0000 0101 1110 0000 0101
第三步: 因为0x0000 5E05在0x0800-0xFFFF之间所以UTF-8的编码规则是1110xxxx 10xxxxxx 10xxxxxx占3个字节
第四步:将二进制放倒对应的UTF-8编码规则里面后: 11100101 10111000 10000101 转换成16进制是:0xe5 0xb8 0x85
所以“帅”UTF-8的十六进制是0xe5 0xb8 0x85
UTF-8转16进制计算器
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值