本文目錄一覽:
- 1、急!C語言編寫 漢字點陣字庫 ‘羅’ ‘恆’這兩個字
- 2、C語言是如何用16點陣方法輸出漢字的?
- 3、如何在C程序中顯示12或16點的點陣漢字
- 4、求用C語言編寫一個能把txt文檔中的所有漢字採用點陣輸出的程序
急!C語言編寫 漢字點陣字庫 ‘羅’ ‘恆’這兩個字
#include stdio.h
// 每個漢字的水平點數
const int WIDTH = 24;
// 每個漢字的垂直點數
const int HEIGHT = 24;
/*
// 方案1 :每個漢字的筆畫
const char FRONT_COLOR[]=”■”;
// 方案1 :每個漢字的背景
const char BACKGROUND_COLOR[]=”□”;
*/
// 方案2 :每個漢字的筆畫
const char FRONT_COLOR[]=”*”;
// 方案2 :每個漢字的背景
const char BACKGROUND_COLOR[]=” “;
// 羅恆
int name1[]=
{
/* “羅”字 */
0x00,0x00,0x00,
0x00,0x00,0x00,
0x08,0x00,0x08,
0x0F,0xFF,0xFC,
0x0C,0x61,0x08,
0x0C,0x61,0x08,
0x0C,0x61,0x08,
0x0C,0x61,0x08,
0x0F,0xFF,0xF8,
0x0C,0x10,0x08,
0x00,0x30,0x00,
0x00,0x60,0x20,
0x00,0xDF,0xF0,
0x01,0x80,0x60,
0x03,0x40,0xC0,
0x06,0x60,0x80,
0x08,0x31,0x80,
0x10,0x23,0x00,
0x00,0x04,0x00,
0x00,0x18,0x00,
0x00,0x60,0x00,
0x03,0x80,0x00,
0x1C,0x00,0x00,
0x00,0x00,0x00,
/* “恆”字 */
0x00,0x00,0x00,
0x08,0x00,0x00,
0x0E,0x00,0x00,
0x0C,0x00,0x08,
0x0C,0x7F,0xFC,
0x0C,0x00,0x00,
0x06,0x00,0x00,
0x05,0x20,0x10,
0x05,0xBF,0xF0,
0x24,0x30,0x30,
0x24,0x30,0x30,
0x64,0x30,0x30,
0x44,0x3F,0xF0,
0x04,0x30,0x30,
0x04,0x30,0x30,
0x04,0x30,0x30,
0x04,0x30,0x30,
0x04,0x3F,0xF0,
0x0C,0x30,0x20,
0x0C,0x00,0x00,
0x0C,0x00,0x04,
0x0D,0xFF,0xFE,
0x0C,0x00,0x00,
0x00,0x00,0x00
};
void printChineseCharVertical(int * data ,int dataSize)
{
int i,j,k,n;
int bit;
// 計算漢字個數
int numOfChar = dataSize/( WIDTH * HEIGHT / 8);
for(n=0;nnumOfChar;n++)
{
for(i=0;iHEIGHT;i++)
{
for(j=0;jWIDTH;j++)
{
bit = data[n*(WIDTH * HEIGHT / 8) + i * WIDTH / 8 + j/8] (1(7-j%8));
if(bit)
{
printf(“%s”,FRONT_COLOR);
}
else
{
printf(“%s”,BACKGROUND_COLOR);
}
}
printf(“\n”);
}
}
}
void printChineseCharHorizontal(int * data ,int dataSize)
{
int i,j,k,n;
int bit;
// 計算漢字個數
int numOfChar = dataSize/( WIDTH * HEIGHT / 8);
for(i=0;iHEIGHT;i++)
{
for(j=0;jnumOfChar*WIDTH;j++)
{
bit = data[(j/WIDTH)*(WIDTH*HEIGHT/8) + i*WIDTH/8 + j%WIDTH/8] (1(7-j%WIDTH%8));
if(bit)
{
printf(“%s”,FRONT_COLOR);
}
else
{
printf(“%s”,BACKGROUND_COLOR);
}
}
printf(“\n”);
}
}
int main(int argc, char *argv[])
{
printChineseCharVertical(name1,sizeof(name1)/sizeof(int));
printChineseCharHorizontal(name1,sizeof(name1)/sizeof(int));
return 0;
}
/*
* *
******************
** ** * *
** ** * *
** ** * *
** ** * *
*****************
** * *
**
** *
** *********
** **
** * **
** ** *
* ** **
* * **
*
**
**
***
***
*
***
** *
** *************
**
**
* * * *
* ** **********
* * ** **
* * ** **
** * ** **
* * **********
* ** **
* ** **
* ** **
* ** **
* **********
** ** *
**
** *
** ****************
**
*
* * ***
****************** ** *
** ** * * ** *************
** ** * * **
** ** * * **
** ** * * * * * *
***************** * ** **********
** * * * * ** **
** * * ** **
** * ** * ** **
** ********* * * **********
** ** * ** **
** * ** * ** **
** ** * * ** **
* ** ** * ** **
* * ** * **********
* ** ** *
** **
** ** *
*** ** ****************
*** **
*/
C語言是如何用16點陣方法輸出漢字的?
到目前為止,我們編寫的C 程序,其用於人機交互的提示或菜單都是英文
的,那麼如何在沒有漢化的Turbo C 集成開發環境下編製顯示漢字的程序呢?
解決這一編程問題,我們首先必須了解有關漢字編碼及字庫的知識。根據對漢字使
用頻率的研究,可把漢字分成高頻字(約100 個),常用字(約3000 個),次常用字(約4000 個),
罕見字(約8000 個)和死字(約45000 個),即正常使用的漢字達15000 個。我國1981 年公布
了《通訊用漢字字符集(基本集)及其交換碼標準》GB2312-80 方案,把高頻字、常用字、和
次常用字集合成漢字基本字符集(共6763 個),在該集中按漢字使用的頻度,又將其分為一
級漢字3755 個(按拼音排序)、二級漢字3008 個(按部首排序),再加上西文字母、數字、圖
形符號等700 個。
漢字編碼:
區位碼
國家標準的漢字字符集(GB2312—80)在漢字操作系統中是以漢字庫的形式提供的。漢
字庫結構作了統一規定,即將字庫分成94 個區,每個區有94 個漢字(以
位作區別)每一個漢字在漢字庫中有確定的區和位編號(用兩個字節),這就是所謂的區位碼
(區位碼的第一個字節表示區號,第二個字節表示位號,因而只要知道了區位碼,就可知道
該漢字在字庫中的地址,每個漢字在字庫中是以點陣字模形式存儲的,如一般採用16×16
點陣形式,每個點用一個二進位表示,存1 的點,當顯示時,可以在屏上顯示一個亮點,存
0 的點,則在屏上不顯示,這樣把存某字的16×16 點陣信息直接用來在顯示器上按上述原
則顯示,則將出現對應的漢字。
內碼
漢字使用兩字節表示,國家制定了統一標準,稱為國標碼。國標碼規定,每個字節使用
後面7 位,第一位為0。為了區別於英文的ASCII 碼,國標碼在計算機上使用的時候,規定
漢字每個字節第一位設置為1,以表示該兩字節為漢字,稱為內碼。以“大”字為例子:
國標碼3473H: 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 1
內碼B4F3H: 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1
國標碼與內碼有一定的轉換公式,即16 進制的區位碼,兩個字節各加80H,就成為了
國標碼。
漢字字模在字庫中存放的位置根據漢字的區位碼來確定,內碼是漢字在機內的表示。由
於區位碼和內碼存在固定的轉換關係,所以當在支持漢字輸入的系統中,鍵盤輸入的漢字內
碼即在程序中存在,將其轉換為區位碼,再從字庫中找到對應的漢字字模,然後再用有關的
位操作和循環語句,對每個字節的每一位進行判斷,如同過濾一樣,如果某位是1,則按設
置的顏色在屏幕的相應位置畫點(用graphics.h 中的顯示象素點的函數putpixel()),若某位
為0,則不畫點,這樣就可按預先設置的顏色在相應位置顯示出該漢字來。
內碼到區位碼的轉換
若漢字內碼為十六進制數h2h1l2l1,則區號qh 相位號wh 分別為:
qh= h2h1-0xa0;
wh= l2l1-0xa0;
若用十進制表示內碼為dld2,則
qh=dl-l60;
wh=d2-160;
即區位碼qw 為:
qw=100*(d1-160)十(d2-160);
反過來,若已經知道了區位碼qw。則也可求得區號和位號:
qh=qw/100;
wh=qw-100*qh;
因而該漢字在漢字庫中離起點的偏移位置(以字節為單位),可計算為:
offset=(94*(qh-1)+(wh-1))* 32;
注意:字庫中每1 區有94 個字符。
這樣,就可以找尋到文件的偏移量,讀出一個char bytes[32]數組。這樣bytes 數組中則
存了要顯示漢字的16×16 點陣字模,然後將字模按行掃描的辦法,通過循環用putpixel()函
數在屏幕設定位置顯示出象點,因而組合成一個顯示的漢字。
如何在C程序中顯示12或16點的點陣漢字
在許多c程序設計中,要用到漢字進行提示或人機交互,而現行的turbo c集成開發環境不是漢化的,如何編製能顯示漢字的c程序呢?
下面的方法可以幫你在西文環境下顯示漢字。這種方法是調用中文漢字庫進行漢字顯示。國家標準規定:漢字庫分94個區,每個區有94個漢字(以位作區別),每個漢字在漢字庫中有確定的區和位編號,這就是漢字的區位碼。每個漢字在庫中是以點陣字模形式存儲的,一般採用16×16點陣(32字節)、24×24點陣(72字節),每個點用一個二進制位(0或1)表示,對應在屏幕上顯示出來,就是相應的漢字。
由於在中文環境下,輸入的是漢字的內碼,我們必須將之轉換成區位碼,算出偏移量,從字庫中找到對應的漢字,將其字模顯示即可。
內碼轉換成區位碼方法如下:
qh=c1-0xa0 wh=c2-0xa0
其區位碼就是:
qw=qh*0xff+wh
該漢字在字庫中離起點的位置是:
offset=(94*(qh-1)+(wh-1))*32l
程序例:
#include 〈graphics.h〉
#include 〈stdio.h〉
#include 〈fcntl.h〉
#include 〈io.h〉
#include 〈stdlib.h〉
#include 〈conio.h〉
#define row 1 //縱坐標放大倍數
#define col 2 //橫坐標放大倍數
void main()
{
int x,y;
char *s=″漢字顯示程序″;
file *fp;
char buffer[32]; //buffer用來存儲一個漢字
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=detect,gm; //圖形屏幕初始化
initgraph(&gd,&gm,″ ″);
if ((fp=fopen(″hzk16″,″rb″))==null)
//打開漢字庫,該字庫可以在ucdos中找到
{ printf(″can’t open haz16,please add it″);
getch(); closegraph(); exit(0);
}
x=20; y=100; //顯示位置設置
while(*s)
{ qh=*(s)-0xa0; //漢字區位碼
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32l; //計算該漢字在字庫中偏移量
fseek(fp,offset,seek_set);
fread(buffer,32,1,fp); //取出漢字32字節的點陣字模存入buffer中(一個漢字)
for (i=0;i〈16;i++) //將32位字節的點陣按位在屏幕上打印出來(1:打印,0:不打印),顯示漢字
for(n=0;n〈row;n++)
for(j=0;j〈2;j++)
for(k=0;k〈8;k++)
for(m=0;m〈col;m++)
if (((buffer[i*2+j]〉〉(7-k))&0x1)!=null)
putpixel(x+8*j*col+k*col+m,y+i*row+n,green);
s+=2; //因為一個漢字內碼佔用兩個字節,所以s必須加2
x+=30;
}
getch();
closegraph();
}
上述程序在turbo c 2.0編譯系統下運行成功,它可以將漢字放大顯示,讀者可以將它改成函數用在您的程序中顯示漢字。
參考gugu99的博客
求用C語言編寫一個能把txt文檔中的所有漢字採用點陣輸出的程序
這基本是一個不可能看成的任務,按照變成的思路,你應該為每一個單獨的漢子進行編寫一個相應的函數,然後讀入txt文檔之後,進行每個字的對應比對。簡單一點你可以按照五筆的想法把漢字進行分解,但是你讀入的漢字就需要結構辨識,這也是很麻煩的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/193796.html