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