《第14章汉字的显示与放大.ppt》由会员分享,可在线阅读,更多相关《第14章汉字的显示与放大.ppt(50页珍藏版)》请在第壹文秘上搜索。
1、2023-10-311汉字的编码汉字的编码用作图方式显示和放大汉字用作图方式显示和放大汉字直接写直接写VRAM显示汉字显示汉字2023-10-312第一节、汉字的编码第一节、汉字的编码汉字的主要编码汉字的主要编码区位码区位码国标码国标码机内码机内码字形码字形码地址码地址码2023-10-313汉字数目众多(康熙字典收录汉字数目众多(康熙字典收录47000多个),多个),但最但最常用的高频字仅约常用的高频字仅约100个,常用字约个,常用字约3000个,次常用字约个,次常用字约4000个,罕见字约个,罕见字约8000个个,其余都是死字。,其余都是死字。1981年,我国公布了通讯用汉字字符集年,我国
2、公布了通讯用汉字字符集(基本集)及其交换码标准(基本集)及其交换码标准GB2312-80方方案,把高频字、常用字、次常用字汇集起来案,把高频字、常用字、次常用字汇集起来组成了汉字基本字符集(共组成了汉字基本字符集(共6763个汉字)。个汉字)。概概 述述2023-10-314上述上述基本字符集基本字符集由三部分组成:由三部分组成:一级汉字一级汉字(使用频度较高的使用频度较高的3755个个汉字汉字,按拼音排序,按拼音排序)二级汉字二级汉字(使用频度略低的使用频度略低的3008个个汉字汉字,按部首排序,按部首排序)西文字符、数字、图形符号西文字符、数字、图形符号(700多个非汉字字符多个非汉字字符
3、)为管理方便,将上述所有字符排列在了一个为管理方便,将上述所有字符排列在了一个94*94的表格中的表格中一、汉字的区位码一、汉字的区位码2023-10-315一、汉字的区位码一、汉字的区位码010203161718565701 02 03 04 0506 07 08 09 10 11 1213 14 15 94942023-10-316表中每一行为一个表中每一行为一个区区,每一列为一个,每一列为一个位位。汉字(字符)在表中的区号和位号构成了汉汉字(字符)在表中的区号和位号构成了汉字的字的区位码区位码。例如:例如:“啊啊”在在16区区01位,故位,故“啊啊”的区位码是的区位码是1601“大大”在
4、在20区区83位,故位,故“大大”的区位码是的区位码是2083说明说明:区位码常以十六进制表示:区位码常以十六进制表示,如:如:1453H一、汉字的区位码一、汉字的区位码2023-10-317二、汉字的国标码二、汉字的国标码计算机要处理汉字,必须给每个汉字一个计算机要处理汉字,必须给每个汉字一个唯一的编码,这些编码是国家唯一的编码,这些编码是国家机构按机构按统一统一标准标准编排的编排的,故称,故称国标码国标码。英文字符是用一个字节编码英文字符是用一个字节编码的,即的,即ASCII码,而汉字数量众多,需要用两个字节才码,而汉字数量众多,需要用两个字节才足以完成编码,所以汉字足以完成编码,所以汉字
5、(含前(含前15区的符区的符号)号)的的国标码是两个字节国标码是两个字节。2023-10-318二、汉字的国标码二、汉字的国标码国标码的两个字节是这样来的:将汉字(国标码的两个字节是这样来的:将汉字(含含前前15区的符号)的区号和位号分别加上区的符号)的区号和位号分别加上32 并并各用一个字节表示出来。各用一个字节表示出来。例如例如:“啊啊”的区号是的区号是16,位号是,位号是1,其国标码是:,其国标码是:00110000 00100001“大大”的区号是的区号是20,位号是,位号是83,其其国标码是:国标码是:00110100 011100112023-10-319二、汉字的国标码二、汉字的
6、国标码提示:提示:汉字汉字区号、位号最大是区号、位号最大是9494+32=126,不超过,不超过127 如:设如:设94区区94位有汉字,其国标码应为:位有汉字,其国标码应为:01111110 01111110结论:结论:国标码的两个字节国标码的两个字节的的最高位都是最高位都是02023-10-3110三、汉字的机内码三、汉字的机内码 每个汉字都有唯一一个国标码,按说可以用计算机每个汉字都有唯一一个国标码,按说可以用计算机处理汉字了,但不幸的是,计算机不仅要处理汉字,处理汉字了,但不幸的是,计算机不仅要处理汉字,还要处理英文字符,而汉字国标码和英文编码是存还要处理英文字符,而汉字国标码和英文编
7、码是存在冲突的。在冲突的。例如:例如:“大大”的国标码是:的国标码是:00110100 01110011,如果把国标码的这两个字节直接存储到计算机中,如果把国标码的这两个字节直接存储到计算机中,则系统很可能把它们当做两个英文字符(字符则系统很可能把它们当做两个英文字符(字符4和字符和字符i),因此计算机内部不能存储国标码。),因此计算机内部不能存储国标码。2023-10-3111三、汉字的机内码三、汉字的机内码为避免和英文为避免和英文的的ASCII码混淆,码混淆,存储汉字存储汉字前前,总是先把国标码两个字节的最高位都改为总是先把国标码两个字节的最高位都改为1然然后再存储后再存储,这样就由国标码
8、变成了,这样就由国标码变成了机内码机内码(计算机内部实际存储的汉字编码)。(计算机内部实际存储的汉字编码)。如:如:“大大”的国标码是的国标码是:00110100 01110011 机内码是机内码是:10110100 111100112023-10-3112三、汉字的机内码三、汉字的机内码注意:存储机内码时,总是把区号对应的字注意:存储机内码时,总是把区号对应的字节存储在低字节,而把位号对应的字节存储节存储在低字节,而把位号对应的字节存储在高字节。在高字节。如:如:“大大”的机内码是:的机内码是:10110100 11110011 对应区号 对应位号1011010011110011低字节高字节
9、2023-10-3113三、汉字的机内码三、汉字的机内码机内码和区位码的转换关系机内码和区位码的转换关系:区号区号=机内码的低位字节机内码的低位字节 160位号位号=机内码的高位字节机内码的高位字节 160解释说明解释说明:机内码是在国标码的基础上将两字节最高位都机内码是在国标码的基础上将两字节最高位都变为变为1而得来,相当于两个字节各加了而得来,相当于两个字节各加了128而国标码是由区位码各加而国标码是由区位码各加32而来而来2023-10-3114四四、汉字的字形码、汉字的字形码汉字的形状各不相同。为在计算机中汉字的形状各不相同。为在计算机中显示汉字,通常都是先把每个汉字的显示汉字,通常都
10、是先把每个汉字的形状记录下来形状记录下来,形成形成字形码字形码例如:例如:16点阵宋体字库中点阵宋体字库中“大大”字的字形字的字形码是这样来的:码是这样来的:2023-10-3115四四、汉字的字形码、汉字的字形码画一个画一个16*16的表格,在上面写一个宋体的表格,在上面写一个宋体“大大”。接下来,从左上角的小方格开始。接下来,从左上角的小方格开始记录记录“大大”字的形状,若小方格被字的形状,若小方格被“大大”字覆盖,则记为字覆盖,则记为1,否则记为,否则记为0。00000011 00000000 00000011 00000000 00000011 00000000 00000011 00
11、000100 11111111 11111110 00000011 00000000 11000000 0000010016点阵宋体“大”字的字形码(32字节)2023-10-3116四四、汉字的字形码、汉字的字形码将所有汉字(符号)的将所有汉字(符号)的16点阵宋体字形码点阵宋体字形码按顺序汇集到一起就是按顺序汇集到一起就是16点阵宋体字库点阵宋体字库字库中存有区位表中所有汉字(符号)的字库中存有区位表中所有汉字(符号)的字形码。当需要显示某汉字(符号)时,字形码。当需要显示某汉字(符号)时,先从字库中调出该汉字的字形码,再在屏先从字库中调出该汉字的字形码,再在屏幕上显示出来。幕上显示出来。
12、2023-10-3117四四、汉字的字形码、汉字的字形码字库有很多种,根据字库有很多种,根据点阵点阵大小不同和汉字大小不同和汉字字体字体的不同,可把字库分为的不同,可把字库分为:16点阵宋体字库、点阵宋体字库、16点阵黑体字库、点阵黑体字库、16点阵仿点阵仿宋字库、宋字库、16点阵楷体字库点阵楷体字库24点阵宋体字库、点阵宋体字库、24点阵黑体字库、点阵黑体字库、24点阵楷点阵楷体字库体字库48点阵点阵60点阵点阵点阵数越大,笔画越平滑,点阵数越小,锯齿越严重。2023-10-3118五五、汉字的地址码、汉字的地址码 对于对于16点阵的字库点阵的字库,一个汉字的字形码在字库中存储一个汉字的字形
13、码在字库中存储的起始位置是的起始位置是:offset=(94*(qh-1)+wh-1)*32 其他点阵其他点阵(设为设为S点阵点阵):offset=(94*(qh-1)+wh-1)*S*S/8 汉字字形码在字库中的首地址称作汉字字形码在字库中的首地址称作该该汉字的汉字的地址码地址码2023-10-3119第二节第二节 作图法作图法显示与放大汉字显示与放大汉字在西文状态下显示汉字一般处理方法在西文状态下显示汉字一般处理方法:在中文操作系统中打开源程序将需要显示的汉字在中文操作系统中打开源程序将需要显示的汉字存入数组存入数组(存储的是汉字的机内码)(存储的是汉字的机内码)如:如:char p=“汉
14、字显示技术汉字显示技术”;程序中程序中 通过机内码计算汉字的区号和位号,从而获得地址码通过机内码计算汉字的区号和位号,从而获得地址码 打开字库文件,读取字形码打开字库文件,读取字形码 图形方式下画点,图形方式下画点,“点点”出汉字出汉字在西文在西文DOS下编译、连接、执行下编译、连接、执行2023-10-3120一一、把汉字存入内存把汉字存入内存在源程序中把要显示的汉字(一个或多个)在源程序中把要显示的汉字(一个或多个)存到内存中。存到内存中。char p =“汉字显示技术汉字显示技术”;或:或:char*p=“汉字显示技术汉字显示技术”;存储源程序时,实际存储的是这些汉字的机存储源程序时,实
15、际存储的是这些汉字的机内码内码 (正如英文字符要被转换为正如英文字符要被转换为ASCII码码)运行程序时,机内码将被装入内存运行程序时,机内码将被装入内存 2023-10-3121二二、计算地址码、计算地址码由机内码可计算出地址码由机内码可计算出地址码:从内存中取出一个汉字的机内码,用来计从内存中取出一个汉字的机内码,用来计算区号算区号qh和位号和位号wh。qh=*(p+i)-160;wh=*(p+i+1)-160;计算该汉字的地址码计算该汉字的地址码 (设字库是设字库是S点阵点阵)offset=(qh-1)*94+(wh-1)*S*S/8;2023-10-3122三、从字库中获得字形码三、从
16、字库中获得字形码#define S 16 /点阵数点阵数#define HZK “d:tcfonthzk16f”char bufferS*S/8;/用来存字形码用来存字形码if(fp=fopen(HZK,rb)=NULL)printf(“打不开字库文件打不开字库文件n”);exit(0);fseek(fp,offset,0);fread(buffer,S*S/8,1,fp);2023-10-3123四、画出汉字四、画出汉字设要在屏幕的(设要在屏幕的(x,y)处显示该汉字)处显示该汉字坐标坐标 x,y第0字节对应的8个像素第25字节对应的8个像素2023-10-3124 要在屏幕上显示出汉字,需要对字型码中的每个字要在屏幕上显示出汉字,需要对字型码中的每个字节进行处理,将每个字节变成节进行处理,将每个字节变成8个像素个像素 编程思路:编程思路:for(i=0;i S*S/8;i+)/将第将第i个字节的字型码,画成个字节的字型码,画成8个点个点 四、画出汉字四、画出汉字(方法一方法一)2023-10-3125四、画出汉字四、画出汉字(方法一方法一)字形码的第字形码的第i个字节,所决定的个字