李翠莲
(吕梁学院 离石师范分校,山西 离石 033000)
在日常工作生活中,利用各种应用软件进行文书编辑时,文字的输入通常采用各种键盘输入法、利用读卡机进行转换识别、语音识别、现今流行的图像识别技术(利用图片识别文字)等,尽管各种方式的输入技术不同,但实现的核心技术是汉字编码。汉字在信息处理系统中,要经过编码、输入、匹配编码、传输、转化和字符码输出环节,在这些环节的关键技术是编码,汉字编码技术现今技术比较成熟,在现阶段仍然采用通过汉字编码方式作为汉字输入计算机的基本方式。
中国汉字的特点:总数超过6万个(包括简化字、繁体字),通过学者研究规定常用汉字3000-4000个,但仍比二三十个英文字母处理要复杂的多;汉字字形复杂,有古体、繁体、简体、正体、异体等字形,笔画相差大,少的只有一笔,多的多达36笔,简化后的字符编码平均为9.8笔;汉语音节416个,分声调后为1295个,以10000个汉字为例计算,每个不带音调的汉字平均24个以上、带调音节平均7.7个以上,个别同音同调字达66个以上,存在大量的同音异字、同字异音,给编码带来诸多困难。
汉字在计算机中的处理采用二进制编码,需要进行人为编码。我国根据计算机应用需求的不同,汉字编码通常分为输入码(也称外码)、交换码(国标码)、机内码和字形码。
通常采用用户利用计算机键盘输入到计算机中的一组符号编码,也就是各种输入法如搜狗五笔输入法、微软拼音输入法、区位码输入法,输入码的编码要求规则简单、易学易用、操作简单、重码率低,输入速度快等,用户可以根据自己需要选择合适的输入码。
计算机的信息处理均采用二进制代码来表示,汉字也采用二进制。二进制代码使用不方便,国家标准局制定国家标准GB2312—80(国标码)。
区位码是国标码的一种表现形式,其特点是采用行列式(即二维坐标形式,行表示区、列表示位),重码率低。国标GB2312—80中,汉字图形符号由94×94组成一个方阵,共分为94个“区”,“位”94/“区”,其中“区”号、位号的从01至94进行编号。94个区与位共编出总数为94×94=8836个编码,其中规定7445个为常用汉字和图形字符各占一个位置,剩下1391个空位用来保留备用。
国标GB2312—80中规定,每一个汉字和图形符号都有唯一确定的二进制编码,在计算机内部和磁盘上记录都汉字和图形都采用机内码表示,汉字在计算机中采用两个字节处理和存储机内码,从区位码到机内码转换,根据国标GB2312—80中规定,区码+32和位码+32转换为国标码,国标码区码+32+128和位码+32+128转换为机内码。
汉字字型码用于在输出设备进行输出,通常采用矢量和点阵两种方式表示。
矢量表示方式以描述汉字字型的轮廓特征,在输出汉字时,通过算法计算汉字字型轮廓,生成所需大小和形状汉字点阵。采用矢量化字型描述汉字字形,文字大小显示分辨率无关,字形输出质量高,无失真。在Windows中TrueType技术是矢量汉字字形码表示方式。
点阵表示字型用汉字字型点阵的代码。根据汉字输出的要求不同,点阵字形码有16*16、24*24、32*32、48*48点阵等等,点阵规模愈大,输出字型越清晰美观,所占存储空间也越大。
汉字地址码为简化内码到地址码转化,它与汉字内码是一一对应关系,是汉字库存储字形码信息的逻辑地址。
在《计算机基础》课程教学中,汉字编码知识从理论上如何利用二进制进行汉字编码及应用给学进行了讲解,在实际教学中发现,学生在学习中缺乏直观认识,对学习兴趣不高,对二进制一知半解,《计算机基础》不涉及编程内容。C语言编译简易、代码效率高、有丰富的运算符、处理低级存储器功能强大(字节处理和位处理能力强大)、具有丰富的数据类型和强大逻辑控制能力。在《C程序设计》教学过程中结合《计算机基础》所学知识,利用《C程序设计》的强大编程功能实现汉字编码的实践教学,提高学生学习的积极性。具体可以采用以下代码实现区位码到汉字的互换。
主要算法是:区机内码 =区码 + 32 + 128,位机内码 =位码 + 32 + 128,具体代码如下,其运行结果如图1所示。
#include
int main()
{
int quma,weima; ∥声明区号和位号两个变量
for(quma=1; quma <=94; quma++)∥利用遍历算法遍历区号
for(weima=1; weima <=94; weima++)∥∥利用遍历算法遍历位号
{
quma=quma+32+128;∥区码+32+128 变为机内码
weima=weima+32+128;∥位码 32+128 变为机内码
printf("%c%c ",(char) quma,(char) weima);∥利用(char)转换强制把区码、位码加160后转换为机内码
}
}
图1 区位码转化为汉字运行结果
汉字到区位码转换是汉字编码的逆运算,即区位码=区机内码—160,位码=位机内码—160,其结果如图2所示。
图2 汉字转化区位码为运行结果
#include
#include
int main()
{
char hanzi[200];∥定义存储字符串数组
int lenHZ;∥定义存储字符串长度变量
int i;∥遍历字符串数组变量
printf("请输入汉字,不超过99个: ");
scanf("%s",hanzi);∥输入字符串
printf(" ");
printf("输出汉字对应的区位码: ");
lenHZ=strlen(hanzi);∥求字符串长度
∥输出汉字代码
for(i=0;i < lenHZ;i=i+2)
{
printf(" ");∥格式控制
printf("%c%c",hanzi[i],hanzi[i+1]);∥汉字输出
printf(" ");∥格式控制
}
printf(" ");
∥输出区位码代码
for(i=0;i < lenHZ;i=i+2)
{
∥格式控制
if(i % 2==0)
{
printf(" ");
}
printf("%02d",(unsigned char)(hanzi[i])-160);∥字符到区码转换
printf("%02d",(unsigned char)(hanzi[i+1])-160);∥字符到位码转换
}
printf(" ");
}
本文利用《计算机基础》课程内容汉字编码算法,结合《C程序设计》课程教学,把理论实践相结合,极大提高了学生学习的积极性,该代码实现同时可以作为实际应用程序:区位码查询软件。既解决了教学问题,又提高了区位码查询的效率和准确率。