gb2312是如何兼容ascii码的?

其实在GB2312编码里,并不是所有的字符都会用两个字节来表示的。为了能清晰说明这个这个问题,我用二进制编码来解释一下。
首先,ASCII编码虽然说是用一个字节来表示字符,但是它其实只用了后7位,第1位永远是0。它的编码范围,从00000000到01111111,都是以0开头的。
而GB2312编码,就是在ASCII编码的基础上进行扩充的,它规定了:ASCII的字符完整地包含在GB2312里,编码不变,仍然是以0开头,用一个字节来表示一个字符;对于ASCII没有的字符,就用1开头来区分,用两个字节合起来表示一个字符。
这样,在解码的时候,遇到字节是以0开头的,就知道这一个字节就表示了一个字符;遇到字节是以1开头的,就知道要加上下一个字节合起来表示一个字符。这样就在GB2312中既把ASCII的字符包含了进来,又能将它们区分出来,能达到兼容的效果了。
举个例子: 假如你使用GB2312写了这么一句话: 我叫ABC
它的二进制编码是这样的:11001110 11010010 10111101 11010000 01000001 01000002 01000003
解码的时候,当遇到1开头的字节,就把两个字节合起来解释为一个字符,于是11001110 11010010会被解释为我;遇到0开头的字节,就只把这个字节解释为一个字符,于是01000001就会被解释为A了。
所以,假设你用GB2312写了一段英文ABC
它的二进制编码会是01000001 01000002 01000003
可以发现,如果使用ASCII写的话,编码也是一样的。
这就能解释了,为什么用GB2312编码的英文,可以用ASCII正常解码出来。
作者:知乎用户
链接:https://www.zhihu.com/question/37560234/answer/281885269
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

gb2312码由两个字节组成,每个字节都大于80H,ASCII码都小于80H,这样肯定没冲突
下面是摘抄部分:
(1)区位码先转换成十六进制数表示
(2)(区位码的十六进制表示)+2020H=国标码;
(3)国标码+8080H=机内码
举例:以汉字“大”为例,“大”字的区位码为2083
解:1、区号为20,位号为83
2、将区位号2083转换为十六进制表示为1453H
3、1453H+2020H=3473H,得到国标码3473H
4、3473H+8080H=B4F3H,得到机内码为B4F3H
这样就不会冲突了

作者:wiki wang
链接:https://www.zhihu.com/question/37560234/answer/94904710
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值