加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 计算机二级 - 正文

 
C语言中如何添加文字
来源:青年人 2010-8-12 编辑:zhanghaifeng 【字体:小 大】
我们都知道,在计算机中英文字符是用一个字节的ASCII码表示,该字节最高位一般用做奇偶校验,故实际是用7位码来代表128个字符的,但是对于众多的汉字,只有用两个字节才能表示,这样用两个字节来表示一个汉字的体制,国家制定了统一的标准,称为国标码。

 

一、汉字在计算机中的编码形式
我们都知道,在计算机中英文字符是用一个字节的ASCII码表示,该字节最高位一般用做奇偶校验,故实际是用7位码来代表128个字符的,但是对于众多的汉字,只有用两个字节才能表示,这样用两个字节来表示一个汉字的体制,国家制定了统一的标准,称为国标码。国标码规定,组成两个汉字代码的各字节最高位为 0,这和英文字符表示方法相同,这就有可能把汉字的国标码看作两个ASCII码,为此又规定在计算机里表示汉字时,把最高位置1,表示该码是汉字,这种最高位为1的代码称为机器内的汉字代码,简称内码。计算机里汉字就是用内码表示的。
例如:“大”这个汉字,
国标码 3473 00110100 01110011
内码 B4F3 10110100 11110011
知道汉字在计算机里是用内码表示的以后,还需要知道具体汉字的结构。我国在1981年公布了《通讯用汉字字符集及其交换码标准》GB2312-80方案,里面规定了高频字、常用字、次常用字集合成汉字基本字符集(共6763个),再加上一些西文字母,希腊字母、日文字符、图形符号等一共700个。国家标准的汉字字符集在汉字操作系统中是以汉字库的形式提供的。汉字库规定,把字库分为94个区(区号),每个区有94个汉字(位号),这就是所谓的区位码(区位码第一字节是区号,第二字节是位号,因为知道了区位码就等于知道了该汉字在字库中的位置)。每个汉字在字库中是以点阵字模形式存储的,如一般采用 16*16点阵形式,这样就需要32字节。在16*16点阵里,存1的点在显示时为一个亮点,存0的点不显示,这样汉字就显示出来了。简单写一下“大”这个字的字模:
0000001100000000
0000001100000000
0000001100000000
0000001100000010
1111111111111110
0000001100000000
0000001100000000
0000001100000000
0000001100000000
0000001110000000
0000011001000000
0000110000100000
0001100000010000
0001000000011000
0010000000001110
1100000000000100
这样当需要显示“大”这个汉字时,首先把这个字模取出,然后逐位显示,1显示0不显示,屏幕上就会出现“大”这个汉字。
那么我们怎么知道汉字的区位码呢?前面说了,汉字在计算机里是用内码存储的。内码和区位码的转换关系是(还以“大”为例):
区号:B4-A0 位号:F3-A0
也就是说,把内码减去A0就是区位码,那么“大”这个汉字的区位码就出来了,是在14H区53H号,也就是第20区第83号。那么由于每个区有94个汉字,“大”这个字应该就是在汉字库的第(20-1)*94+(83-1)个汉字位置(每个汉字字模占32字节)。那么现在又要问了,内码又是怎样得到的呢?看下面的程序:
main()
{
unsigned char *s=大;
printf(%x,%x\n,s[0],s[1]);
getch();
}
运行程序发现,输出就是b4,f3。

二、西文方式下显示中文
说到这儿,大家应该有个思路了吧。要想显示汉字:
(1) 获得汉字内码
(2) 换算成区位码
(3) 在字库中取出该汉字的字模(共32字节)
(4) 1显示0不显示
说到这儿,又有一点要说明,由于汉字是16*16点阵结构,说明在一般的西文方式下还不行,因为一般的西文方式,屏幕显示都是80*25的文本格式,要想显示中文,必须切换到图形模式,在图形模式下才有象素的概念。
下面是一个实际的例子,大家可以复制到TC里运行一下就知道了。

#include stdlib.h
#include stdio.h
#include string.h
#include graphics.h

void WriteHzStr();
void WriteHz(unsigned char,unsigned char,int,int);
void GetHzBit(unsigned char,unsigned char);

char *s=中华人民共和国;
FILE *fp;
long int fpos; /*具体汉字在字库中的偏移量*/
char bitdata[32]; /*存储汉字字模*/

main()
{
int gdrive=DETECT,gmode;
initgraph(&gdrive,&gmode,); /*加载图形模式*/
if((fp=fopen(c:\\hzk16,rb))==NULL) /*打开16*16点阵汉字字库*/
{
printf(cannot open file\n);
exit(0);
}
WriteHzStr();
fclose(fp);
closegraph();
getch();
}

void WriteHzStr()
{
int num,i,x,y;
num=strlen(s); /*获取字符串长度*/
x=0,y=0;
for(i=0;i
{
WriteHz(s[i],s[i+1],x,y);
x+=16;
if(x>=640) {y+=16;x=0;}
}
}

void WriteHz(unsigned char left,unsigned char right,int x,int y)
{
unsigned char bit[8]={128,64,32,16,8,4,2,1};
int i,j;
GetHzBit(left,right);
for(i=0;i<16;i++)
for(j=0;j<8;j++) /*和bit[]与操作以后,在屏幕上画点*/
{
if(bitdata[2*i]&bit[j]) putpixel(x+j,i+y,YELLOW);
if(bitdata[2*i+1]&bit[j]) putpixel(x+8+j,i+y,YELLOW);
}
}

void GetHzBit(unsigned char left,unsigned char right)
{
fpos=32L*((left-161)*94+(right-161)); /*获得字模在字库中的位置*/
fseek(fp,fpos,SEEK_SET);
fread(bitdata,32,1,fp); /*把该汉字字模读入到bitdata中*/
}

说明一点,上面用到的汉字库文件hzk16在UCDOS里可以找到,大小是262K。

三、中文模式下显示中文
这个问题比较简单,就是先进入UCDOS等类似的中文平台,然后一切和普通的字符串显示类似。看下面的程序:

main()
{
char *s=中华人民共和国;
printf(%s\n,s);
getch();
}

运行此程序前先进入UCDOS等中文平台,所以由于各计算机不一定都装有UCDOS,使得程序移植性不强,所以一般都不这样使用,而采用前面说的西文模式下显示中文。

注明:这里只是16*16的汉字,如果想使用24*24的,或者正楷,黑体、隶书等汉字字体,就需要使用不同的汉字库,例如hzk24k(正楷),hzk24h(黑体)等等。

 

 

 



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
推荐文章
  • 此栏目下没有推荐文章
  • 热门文章

    报名考试
    全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
    青海 | 宁夏 | 甘肃 | 新疆 | 陕西
    西藏 | 北京 | 天津 | 河北 | 山东
    江苏 | 安徽 | 河南 | 上海 | 浙江
    福建 | 广东 | 山西 | 湖南 | 湖北
    江西 | 广西 | 海南 | 云南 | 贵州
    四川 | 重庆
    分省高校计算机考试
    黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
    北京 | 天津 | 新疆 | 甘肃 | 宁夏
    青海 | 陕西 | 山西 | 河南 | 山东
    江苏 | 安徽 | 浙江 | 福建 | 广东
    海南 | 广西 | 江西 | 湖北 | 湖南
    四川 | 上海 | 重庆 | 贵州 | 云南
    西藏
    成绩查询
    报考指南
    试题答案
    模拟试题
    考试辅导
    计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
    经验交流
    高校计算机