欢迎大家来到计算机基础训练营,今天我们来探讨汉字的字符编码,汉字字符编码要比西文字符编码复杂的多。汉字字符编码涉及到国标码、区位码、外码、内码和地址码。
一、国标码和区位码
汉字不同于西文字符,汉字的信息量很大,约有9万多汉字,而且汉字形象化且直观达意,其字形数据量远大于西文字符,汉字的这些特点决定了汉字编码和西文字符编码的不同。汉字编码涉及到下面两个问题:
(1)汉字使用几个字节进行编码?
(2)输入汉字时,如何进行编码映射?
我国在1980年发布了国家汉字编码标准GB2312-80,全称为《信息交换用汉字编码字符集-基本集》,简称GB码或国标码。

GB2312-80规定每个汉字字符使用2个字节进行编码,每个字节的最高位为0,表示方式为4位16进制数。例如:汉字“火”的国标码为3B70H,汉字“保”的国标码为3123H。
GB2312并没有把所有的汉字都容纳进来,GB2312编码的数量为6736个汉字,一级汉字(常用字)3755个,二级汉字(次常用汉字)3008个,还编码了682个字符,包含有数字、一般符号、拉丁字母、日本假名、希腊字母、俄文字母、拼音符号、注音字母等。
由于国标码采用4位16进制数表示,为了便于交流,大家常用的是4位10进制的区位码。国标码和区位码两者之间有一个简单的转换关系:国标码的高低字节分别减去20H,将高低再分别转换为10进制数,高字节为区号,低字节为位号;区位码转换为国标码进行相反运算即可。

例如:汉字“火”的国标码为3B70H,高字节为3BH,低字节为70H,3BH减去20H为1BH,70H减去20H为50H,1BH转换为10进制数为27,50H转换为10进制数为80,2780即为国标码3B70H的区位码。
区位码的区号和位号构成了一个有94个区(区号分别为1到94)、每个区内有94个位(位号分别为1到94)的汉字字符集。

二、外码、内码和字形码
西文字符的输入是通过键盘硬编码为ASCII码。但汉字不能通过键盘进行国标码的硬编码,汉字的输入主要是通过输入法程序进行输入,常用的输入法有拼音输入法、智能ABC输入法等。

输入法输出的编码为汉字的外码,不同输入法输出的外码是不相同的。例如:拼音输入法通过汉字的读音形成外码;五笔输入法根据汉字的字形形成外码。所有输入法生成的外码都要统一转换为国标码,国标码还需要转换为内码才能存储到计算机存储器,因此计算机存储汉字的编码称为内码,计算机为什么不能存储国标码呢?

我们看一个例子就明白了。汉字“保”的国标码是3123H,高字节是31H,低字节是23H。数字“1”的ASCII码是31H,符号“#”的ASCII码是23H。若计算机存储了国标码3123H,很容易和ASCII码发生冲突。为解决国标码和ASCII码的冲突,将国标码高低字节的最高为都设置为1,用于区分国标码和ASCII码(ASCII码的最高为为0),转换后的国标码称为内码。
字形码是汉字的点阵数据,如下图所示:

汉字“我”的字形码为16 X 16点阵,共256个像素点,存储该字形需要32个字节,若存储GB2312的6736个汉字,至少需要200KB的存储空间,这些字形数据被存储到称为汉字字库的文件中,地址码就是字形码在汉字字库的逻辑地址。
当前主流使用的汉字字库是矢量字库,矢量字库显示的字形可以任意缩放,因为矢量字库存储的是字形的笔画,字形的每个笔画由直线或曲线绘制完成。
GB2312标准发布后,我国又发布了GBK编码标准,它是对GB2312的补充,2001年又发布了GB18030编码标准,可以收录2.6万个汉字。