关于汉字国标码GB2312中的“机内码”说明

发布时间 2020-03-22

注意:请全文阅读下方所提及“机内码”描述,以免引起理解错误。事实上你应明白:“机内码”指编码的一个分类,而非特定一种编码。引起理解错误的主要原因是GB2312编码方案中所指的机内码,造成与国标码的混乱。

----------------------------

一九八〇年发布的GB2312-80编码方案进行了分区处理,所以有一个区位码概念;为了避免与ASCII编码中的不可见字符(0x00~0x1F,即10进制的0~31)以及空格(0x20,即10进制的32)冲突,又将区码和位码分别加上32(即16进制的20)作为“国标码”。但是,这个“国标码”仍然与ASCII方案(编码范围是0x00~0x7F,即10进制的0~127)中的其它字符冲突,故,又把“国标码”每个字节2进制的最高位都由0变成1,这相当于每个字节再加上128(即16进制的80),从而得到“机内码”。

例如“啊”字区位码是1601,“国标码”是0x3021,“机内码”是0xB0A1。

为什么没有一步到位避开ASCII中的所有字符?因为GB2312-80方案是1980年发布的,而ASCII方案1986年才定了最终版本。此后,计算机中使用GB2312编码方案时都采用上述机内码,以兼容ASCII字符集,而所谓国标码反而无用武之地。

一九九五年发布的《汉字内码扩展规范(GBK)》1.0版对GB2312标准进行了扩充,此时,仍然称其为“内码”。直到二〇〇〇年GB18030-2000标准发布,取代了GBK,这才摒弃“国标码”与“机内码”同存的称呼,与ASCII兼容的“机内码”成为名正言顺的“国标码”,GB2312的老国标码弃用。

所以,现在提到汉字国标码,不要再去纠结什么机内码,请忽略它,直接将GB2312及GBK所谓的内码作为国标码对待。而且,2017年起,GB2312-80标准已经转化为推荐性标准GB/T 2312-1980,不再强制执行。再者,现在的中文处理多以国标GB18030和国际通用的Unicode编码方案执行,GB2312及其扩展方案GBK逐渐会被淘汰。

----------------------------

人机交互的汉字传输编码可分为两个类别:机外码和机内码。

机外码:即人向计算机输入汉字时在键盘上按键的编码。例如输入“汉”,拼音输入时按键“han”,五笔输入时按键“ic”等等,都是机外码;
机内码:计算机传输存储汉字时使用的编码。国标码(GB2312/18030)中“汉”编码是“BABA”,国际码(Unicode)中“汉”编码是“6C49”等等,都是机内码。

----------------------------

目前,网络上描述机内码的文章(多为旧文)很多都引导至GB2312中提到的概念,我们应该摒弃淡忘这个描述,正确理解机内码是一个分类而非特定的一种编码。提到GB2312编码,也应该理解B0A1就是“啊”的国标码,别无其它。

GB2312编码表

QQXIUZI.CN 千千秀字