背景
问题: 某汉字的国标码为5650H,那么它的机内码为( B )。
A E6E0H
B D6D0H
C C6C0H
D 8080H
答题
思考
为什么要加上2020H和8080H?区位码、内码、国标码怎么转换非常简单,原因是什么?
- GB2312是中文编码,但是里面有对 26个英文字母和一些特殊符号的编码,按理说这和ASCII重合的部分应该无需设置,沿用ASCII中不就行了?但是当时在制定GB2312之前,就决定覆盖掉ASCII中符号和英文字母部分,所以将其中的英文字母和符号重新编入GB2312中。而对于ASCII中前32个控制字符则继续沿用。所以保留前32字符,将汉字编码向后偏移32,十六进制20H,这也就是区位码要加上20H得到国标码,这就是GB2312的编码规范。
- 而这样产生一个弊端,某些早期用ASCII码编码的英文文章无法打开,一打开就是乱码,也就是说应该要兼容早期ASCII码而不是覆盖它!为了解决这个问题,将字节的最高位设为1,因为**ASCII中使用7位,最高位为0。这样就区分开了ASCII和GB2312**。这也是为什么要加上8080H。 其实我们说国标码才是GB2312的规范编码,后来的内码是微软为了解决冲突问题而采用的方式,本质上是修改了GB2312的编码标准,而这种方法最后产生的编码最后就被一些教科书称为内码
- 个人理解:
- 2020H: 相当于ASCII中 前32字符, 32换算16进制 就是20H
- 8080H: 相当于ASCII中 128个字符,128换算16进制就是 80H
- 最终:
- 机内码 = 国标码 + 8080H
- 机内码 = 区位码 + A0A0H
- 国标码 = 区位码 + 2020H