国标码与机内码 余巍然 1997-01-01   西文字符由于数量较少(通常不超过128个),所以采用1个字节(8位)就能完成对所有的西文字符的编码,ASCⅡ码规定西文字符的编码只使用字节的低7位(从第1位到第7位),最高位设为0。所以ASCⅡ码的编码范围是十进制数0~127(写成十六进制即00H~7FH)。   汉字的个数远比西文字符多,国家标准规定的最常用和较常用的汉字便近8000个。显然,如果象西文字符那样采用1个字节对汉字编码就不够了。所以国家标准规定,每个汉字的编码都采用2个字节表示。汉字国标码的一个特点是,尽可能与西文字符的ASCⅡ码相一致。所以汉字国标码的每个字节都只采用其最低7位(从第1位到第7位)。最高位仍然取0。   汉字国标码的取值范围是十进制数33~126(写成十六进制即21H~7EH)。   举例来说,“天”字国标码的两个字节分别是76、108(十进制),写成十六进制是4CH,6CH,写成二进制便是01001100B,01101100B:   “天”的国标码:   01001100  01101100     第2字节      第1字节   汉字国标码作为一种国家标准,是所有汉字编码都必须遵循的一个共同标准,但由于国标码每个字节的最高位都是0,这正好与ASCⅡ码相冲突。例如“天”字的国标码是76、108,而西文字符“L”和“l”的ASCⅡ码也恰好是76和108,现在假如内存中有两个字节76、108,这到底是一个汉字“天”呢,还是两个西文字符“L”和“l”?都有可能,这就出现了二义性。显然国标码在计算机内部是不可能直接使用的,必须对其进行某种变换后才可以使用。其变换方法便是将国标码双字节的每个字节都加上128,相当于将国标码每个字节的最高位即第8位都由0变成1,其余7位不变。这种经过变换的国标码就是汉字的机内码。显然汉字机内码的每个字节都大于128,这就与西文字符的ASCⅡ码区分开了(ASCⅡ码都小于128)。   例如,上面举的汉字“天”的国标码是76、108,将国标码的每个字节都加128,就得到其机内码204、236(均是十进制),写成十六进制就是CCH、ECH,写成二进制便是11001100B、11101100B。   每个字节的第8位都由0变成了1,其余位不变。   “天”的机内码:   11001100  11101100     第2字节      第1字节   通过以上分析可看出,汉字国标码在两个字节中占用7位,而汉字机内码在每个字节中的8位全占用了。在计算机内部实际采用都是机内码而不是国标码。   还要指出的是,机内码是个相当广泛的概念,凡是计算机内部实际采用的汉字代码都叫机内码,我们以上所说的是采用双字节并且将国标码的每个字节的最高位都置为1,这只是目前一种最常用的汉字机内码方案,但汉字内码不止这一种,如台湾等地采用的就不是这种机内码方案,但这同样也叫机内码。