?? 陣漢字顯示 - gameres_com.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>陣漢字顯示 - GameRes.com</title>
</head>
<body topmargin="0" leftmargin="0" text="#FFFFFF" bgcolor="#010013">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="211">
<tr>
<td width="21%" height="49"><a href="http://www.gameres.com">
<img border="0" src="../../../images/titlesmall.jpg" alt="中國游戲技術資源網" width="200" height="47"></a></td>
<td width="45%" height="49"></td>
<td width="34%" height="49"></td>
</tr>
<tr>
<td width="100%" colspan="3" height="18"><font face="Tahoma" size="2"> </font></td>
</tr>
<tr>
<td width="100%" colspan="3" height="21">
<div align="center">
<table border="0" width="90%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%" bgcolor="#1D2532">
<p align="right">
<font face="Tahoma" size="2">吳進 </font>
</tr>
</table>
</div>
</td>
</tr>
<tr>
<td width="100%" colspan="3" height="41">
<div align="center">
<center>
<table border="0" width="90%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%"><font face="Tahoma" size="2"> </font></td>
</tr>
<tr>
<td width="100%">
<p align="center"><font face="Tahoma" size="2" color="#FFFFDF"><b>陣漢字顯示</b></font>
</td>
</tr>
</table>
</center>
</div>
</td>
</tr>
<tr>
<td width="100%" colspan="3" height="61">
<div align="center">
<center>
<table border="0" width="90%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%">
<div align="center">
<table border="0" width="95%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%"><font face="Tahoma" size="2"><b><br>
目錄:<br>
</b> <a style="color: #FF9933" target="_self" href="#DOS下的點陣漢字">DOS下的點陣漢字</a><b><br>
</b> <a style="color: #FF9933" target="_self" href="#漢字的內碼">漢字的內碼</a><b><br>
</b> <a style="color: #FF9933" target="_self" href="#漢字字模">漢字字模</a><b><br>
</b> <a style="color: #FF9933" target="_self" href="#漢字庫文件">漢字庫文件</a><b><br>
</b> <a style="color: #FF9933" target="_self" href="#打印字庫文件和HZK12">打印字庫文件和HZK12</a><b><br>
<br>
文檔內容:<br>
<br>
<a name="DOS下的點陣漢字">DOS下的點陣漢字</a></b><br>
<br>
你是否碰到過用啟動盤啟動系統后用DIR命令得到一串串莫名其妙的字符?有經驗的朋友會告訴你:那是漢字。漢字?你不禁會問:怎么一個我一個也不認識。但那確確實實是漢字,如果你啟動UCDOS或其他的漢字系統后,就會看到那是一個個熟悉的漢字。同樣是漢字,為什么前后會看到不同的結果?呵呵,其實在電腦硬件中,根本沒有漢字這個概念,也沒有英文的概念,這鐵玩意認識的概念只有——內碼。<br>
<br>
<b><a name="漢字的內碼">漢字的內碼</a><br>
</b><br>
點頭表示什么?是“對”、“YES”,偏偏有的地方表示的意義卻恰恰相反。一個動作,有不同的詮釋;一個問題,有不同的答案;而一個符號,卻有不同的意義,關鍵在于:你是如何地理解。在電腦中亦如此,所有的數據都是以0和1保存的,按不同的數據操作,可以得到不同的結果。對于顯示英文操作,由于英文字母種類很少,只需要8位(一字節)即可。而對于中文,常用卻有5000以上,于是我們的DOS前輩想了一個辦法,就是將ASCII表的高128個很少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字符使用,即英文的內碼。不信,你可以用記事本寫一C文件:<br>
<br>
</font><font size="2" face="Fixedsys">main()<br>
{<br>
unsigned char *s,*e="ABcd",*c="你好";<br>
clrscr();<br>
printf("English char =");<br>
s=e;<br>
while(*s!=0) /*C的字符串以0為結束符*/<br>
{<br>
printf("%3d,",*s);<br>
s++;<br>
}<br>
printf("\nChinease char=");<br>
s=c;<br>
while(*s!=0)<br>
{<br>
printf("%3d,",*s);<br>
s++;<br>
}<br>
getch();<br>
}<br>
</font><font face="Tahoma" size="2"><br>
再用TC輸入*.txt打開運行,看見了沒有,那些數值即英文和漢字的各字節內碼。<br>
<br>
<b><a name="漢字字模">漢字字模</a></b><br>
<br>
得到了漢字的內碼后,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀,如英文的'A'在字模中是這樣記載的:<br>
<img border="0" src="fontDOS_1.gif" width="344" height="253"><br>
而中文的“你”在字模中卻是這樣記載的:<br>
<img border="0" src="fontDOS_2.gif" width="553" height="260"><br>
</font>
<p class="my02" align="left"><font face="Tahoma" size="2"> 在硬件系統內,英文的字模信息一般固化在ROM里,即使在沒有進入系統的CMOS里,也可以讓你看到英文字符。而在DOS下,中文的字模信息一般記錄在漢字庫文件HZK16里。<br>
<br>
<b><a name="漢字庫文件">漢字庫文件</a></b></font></p>
<p class="my02" align="left"><font face="Tahoma" size="2"> 了解字母和漢字是按字模位信息顯示的原理后,那如何得到漢字的字模信息呢?難道要我們自己去做?NO。DOS前輩們經過艱辛的努力,將制作好的字模放到了一個個標準的庫中以免去后輩的麻煩,這就是點陣字庫文件。一般我們使用16*16的點陣宋體字庫,所謂16*16,是每一個漢字在縱、橫各16點的區域內顯示的。不過后來又有了HZK12、HZK24,HZK32和HZK48字庫及黑體、楷體和隸書字庫。雖然漢字庫種類繁多,但都是按照區位的順序排列的。前一個字節為該漢字的區號,后一個字節為該字的位號。每一個區記錄94個漢字,位號則為該字在該區中的位置。因此,漢字在漢字庫中的具體位置計算公式為:94*(區號-1)+位號-1。減1是因為數組是以0為開始而區號位號是以1為開始的。這僅為以漢字為單位該漢字在漢字庫中的位置,那么,如何得到以字節為單位得到該漢字在漢字庫中的位置呢?只需乘上一個漢字字模占用的字節數即可,即:(94*(區號-1)+位號-1)*一個漢字字模占用字節數,而按每種漢字庫的漢字大小不同又會得到不同的結果。以16*16點陣字庫為例,計算公式則為:(94*(區號-1)+(位號-1))*32。漢字庫文該從該位置起的32字節信息即記錄了該字的字模信息。<br>
</font></p>
<p class="my02" align="left"><b><font face="Tahoma" size="2">漢字庫文件</font></b></p>
<p class="my02" align="left"><font face="Tahoma" size="2"> 了解點陣漢字及漢字庫的構成原理后,顯示漢字就變得簡單。以16*16點陣字庫為例,通常的方法是:將文件工作指針移到需要的漢字字模處、將漢字庫文件讀入一2*16數組再用for循環一位位地顯示。以使用VGAHI模式顯示“我”字為例,程序如下:<br>
</font><font size="2" face="Fixedsys">#include
"graphics.h"<br>
#include "stdio.h"<br>
main()<br>
{<br>
int i=VGA,j=VGAHI,k;<br>
unsigned char mat[16][2],chinease[3]="我";<br>
FILE *HZK;<br>
if((HZK=fopen("hzk16","rb"))==NULL)<br>
exit(0);<br>
initgraph(&i,&j,"");<br>
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*獲得區碼與位碼*/<br>
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);<br>
fread(mat,32,1,HZK);<br>
<br>
for(j=0;j<16;j++)<br>
for(i=0;i<2;i++)<br>
for(k=0;k<8;k++)<br>
if(mat[j][i]&(0x80>>k)) /*測試為1的位則顯示*/<br>
putpixel(i*8+k,j,WHITE);<br>
<br>
getch();<br>
closegraph();<br>
fclose(HZK);<br>
}</font><font face="Tahoma" size="2"><br>
怎么樣?只要掌握了正確的方法,顯示漢字并不復雜。<br>
<br>
<b><a name="打印字庫文件和HZK12">打印字庫文件和HZK12</a></b></font></p>
<p class="my02" align="left"><font face="Tahoma" size="2"> 如果你有UCDOS的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體),你還可以使用不同字體的大字模漢字了。HZK24系列是24*24的點陣字庫,每字模占用3*24字節。如果你按照HZK16的顯示方法的話,你會看到......呵呵,字被放倒了。這是因為該類字庫與一般的漢字庫不同,這類大字模漢字庫是專供打印的打印字庫,為了打印的方便將字模都放倒了,你使用時,只要將字模的位信息縱橫轉置顯示即可。例如你如果定義為mat[24][3]則應該這樣輸出:<br>
</font><font size="2" face="Fixedsys"> for(i=0;i<24;i++)<br>
for(j=0;j<24;j++)<br>
if((0x80>>i%8)&mat[j][i/8]) /*轉置顯示*/<br>
putpixel(j+x,y+i,color);<br>
</font><font face="Tahoma" size="2"> 還有一類字庫HZK12,雖然屬于標準字庫類型,但如果你將它的字模當作12*12位計算的話,根本無法正常顯示漢字。因為字庫設計者為了使用的方便,字摸每行的位數均補齊為8的整數倍,于是實際該字庫的位長度是16*12,雖然每行都多出了4位,但這4位都是0(不顯示),并不影響顯示效果。<br>
</font></td>
</tr>
</table>
</div>
</td>
</tr>
</center>
<tr>
<td width="100%" bgcolor="#1D2532">
<font face="Tahoma" size="2"> </font></td>
</tr>
<tr>
<td width="100%">
<font face="Tahoma" size="2">
</font></td>
</tr>
</table>
</div>
</td>
</tr>
<tr>
<td width="100%" colspan="3" height="21"></td>
</tr>
</table>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -