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

发布时间 2020-03-22

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

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

一九八〇年发布的GB2312编码标准中,除了有一个“区位码”概念,还有一个“机内码”概念(如今应该废弃)。

在GB2312方案描述中,区位码的区号和位号分别转换成16进制,再分别加上0x20,就得到“国标码”的高位字节和低位字节;在“国标码”基础上,每个字节分别再加上0x80就得到“机内码”。

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

GB2312标准中规定的这个“国标码”是与ASCII字符冲突的(码位重叠),为了与其兼容,所以又制定了“机内码”。采用GB2312标准的程序处理汉字均是以此“机内码”作为编码格式(EUC-CN),而这个标准中的“国标码”反而无用武之地。

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

据称,GB2312中编制的“国标码”是为了避开ASCII字符中的不可见字符和空格,即0~0x20。为什么没有一步到位兼容ASCII所有字符不得而知,但是从GB18030-2000编码开始,我们应该只称其为国标码,因为机内码应该是一个类别,而不是一套编码标准,国标码只是机内码的一种。

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

现在,我们来厘清一下汉字编码:

首先,人机交互的汉字传输编码只有两个类别:机外码和机内码。

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

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

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

GB2312编码表

QQXIUZI.CN 千千秀字