Ⅰ 急!c語言如何顯示漢字
先說明一下:在TC下面顯示漢字是比較麻煩的,實在想用,可以用VC。
DOS下的點陣漢字
你是否碰到過用啟動盤啟動系統後用DIR命令得到一串串莫名其妙的字元?有經驗的朋友會告訴你:那是漢字。漢字?你不禁會問:怎麼一個我一個也不認識。但那確確實實是漢字,如果你啟動UCDOS或其他的漢字系統後,就會看到那是一個個熟悉的漢字。同樣是漢字,為什麼前後會看到不同的結果?呵呵,其實在電腦硬體中,根本沒有漢字這個概念,也沒有英文的概念,這鐵玩意認識的概念只有——內碼。
☆漢字的內碼
點頭表示什麼?是「對」、「YES」,偏偏有的地方表示的意義卻恰恰相反。一個動作,有不同的詮釋;一個問題,有不同的答案;而一個符號,卻有不同的意義,關鍵在於:你是如何地理解。在電腦中亦如此,所有的數據都是以0和1保存的,按不同的數據操作,可以得到不同的結果。對於顯示英文操作,由於英文字母種類很少,只需要8位(一位元組)即可。而對於中文,常用卻有5000以上,於是我們的DOS前輩想了一個辦法,就是將ASCII表的高128個很少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字元使用,即英文的內碼。不信,你可以用記事本寫一C文件:
main()
{
unsigned char *s,*e="ABcd",*c="你好";
clrscr();
printf("English char =");
s=e;
while(*s!=0) /*C的字元串以0為結束符*/
{
printf("%3d,",*s);
s++;
}
printf("\nChinease char=");
s=c;
while(*s!=0)
{
printf("%3d,",*s);
s++;
}
getch();
}
再用TC輸入*.txt打開運行,看見了沒有,那些數值即英文和漢字的各位元組內碼。
☆漢字字模
得到了漢字的內碼後,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀。在硬體系統內,英文的字模信息一般固化在ROM里,即使在沒有進入系統的CMOS里,也可以讓你看到英文字元。而在DOS下,中文的字模信息一般記錄在漢字型檔文件HZK16里。
☆漢字型檔文件
了解字母和漢字是按字模位信息顯示的原理後,那如何得到漢字的字模信息呢?難道要我們自己去做?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位元組信息即記錄了該字的字模信息。
☆點陣漢字的顯示
了解點陣漢字及漢字型檔的構成原理後,顯示漢字就變得簡單。以16*16點陣字型檔為例,通常的方法是:將文件工作指針移到需要的漢字字模處、將漢字型檔文件讀入一2*16數組再用for循環一位位地顯示。以使用VGAHI模式顯示「我」字為例,程序如下:
#include "graphics.h"
#include "stdio.h"
main()
{
int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*獲得區碼與位碼*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*測試為1的位則顯示*/
putpixel(i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}
怎麼樣?只要掌握了正確的方法,顯示漢字並不復雜。
☆列印字型檔文件和HZK12
如果你有UCDOS的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體),你還可以使用不同字體的大字模漢字了。HZK24系列是24*24的點陣字型檔,每字模佔用3*24位元組。如果你按照HZK16的顯示方法的話,你會看到......呵呵,字被放倒了。這是因為該類字型檔與一般的漢字型檔不同,這類大字模漢字型檔是專供列印的列印字型檔,為了列印的方便將字模都放倒了,你使用時,只要將字模的位信息縱橫轉置顯示即可。例如你如果定義為mat[24][3]則應該這樣輸出:
for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*轉置顯示*/
putpixel(j+x,y+i,color);
還有一類字型檔HZK12,雖然屬於標准字型檔類型,但如果你將它的字模當作12*12位計算的話,根本無法正常顯示漢字。因為字型檔設計者為了使用的方便,字摸每行的位數均補齊為8的整數倍,於是實際該字型檔的位長度是16*12,雖然每行都多出了4位,但這4位都是0(不顯示),並不影響顯示效果。
☆理論差不多了下面是我寫的一個實踐例子
/*
*TC下的漢字顯示演示程序
*LO幾又VE 22:58 2005-5-23
*將hzk16文件放至TC安裝目錄下
*hzk16文件下載地址
*下載字體文件
*/
#include <graphics.h>
#include <stdio.h>
#define MAXX 640 /*屏幕寬度 */
#define MAXY 480 /*屏幕高度 */
#define WIDTH 20 /*每一漢字寬度*/
#define HIGH 20 /*每一漢字高度*/
int priChi(unsigned char *); /*中文列印函數,傳入參數:中文數組指針 返回值 -1 異常 0 正常*/
int X=0; /*全局變數X Y控制中文列印格式*/
int Y=0;
int main()
{
char chinese[][60]={/*TC編譯器不支持長行 所以將中文字元串以二維形式存放*/
"我放棄清華計算機專業的保送資格而選擇參加高考的消息震撼了全校",
"從校長到班主任到各科目任課老師都找我談過話我有點驚異他們的變",
"化在我獲得全國信息大賽一等獎外加特別獎以前我似乎是個可有可無",
"的人物突然間變的如此的炙手可熱我覺得我的大腦前所未有的不夠用",
"說起這個特別獎還真的挺有意思雖然叫全國決賽但也無非是出幾個筆",
"試題再弄個上機程序編一下限時總共是三小時規定語言是西語言或者",
"派司卡在我花了半個小時分別用兩種語言把該程序完成後我覺得坐在",
"那實在是浪費我的大好青春於是我決定用匯編語言把它再寫一遍本來",
"我准備用微操作的十六進制碼寫的但考慮到時間問題只好放棄有人說",
"是金子總會發光此話誠不欺我啊正當我熱火朝天全心投入編程的時候",
"卻不知道自己已經被某人注意了很久了三小時之後我走出考場之後某",
"人趕緊抓住我很興奮的叫了一聲小朋友這聲小朋友直接導致我在數年",
"後還經常從噩夢中驚醒同時也是我拒絕清華邀請的直接導火索我們把",
"話題回到事發現場我在嚇了很大一跳後把頭轉了回來一個瘦干老頭正",
"抓著我的手兩眼放光的樣子還似乎是略帶深情的看著我我全身雞皮疙",
"瘩頓時爭先恐後的向外鑽我渾身一個機靈趕緊抖手老頭似乎感覺到了",
"異樣送開我的手略帶尷尬的道小朋友我自我介紹一下我是清華大學計",
"算機系的主任受邀到比賽的現場觀看順便看看有沒有什麼可挖掘的人",
"才那個你明白我的意思吧這句話很是影響清華學生理解力在我心目中",
"的地位你這意思不就是認為我是可挖掘的人才嗎我點了點頭老頭看我",
"能理解顯的很興奮然後開始滔滔不決的向我介紹清華計算機專業的實",
"力如何如何的雄厚在國內甚至國際是如何如何的有影響力最後滿懷深",
"情的看了我眼嚴肅的告訴我他將代表清華計算機專業歡迎我去他們那",
"念書我苦苦忍耐著他的飛濺唾沫委婉的表示這件事非同小可我必須回",
"家和父母商量一下然後逃也似的離開當然第一個去的地方是衛生間我",
"的臉啊誰知道老頭的唾沫會不會讓我的臉起老年斑回到學校的一個禮",
"拜後我就接到了清華正式邀請這個消息經我班主任的烏鴉嘴迅速在全",
"校蔓延而後又經過各種渠道迅速匯總到我父母耳朵"};
if(-1 == priChi(chinese))
{ /*列印異常*/
printf("Press any key to exit...");
fflush(stdin);
getch();
return 1;
}
return 0;
}
int priChi(unsigned char *chi)
{
unsigned char mat[16][2];
int i=VGA,j=VGAHI,k;
int sec,pot;
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL) /*打開字體庫文件*/
{
printf("Open style file (hzk16) failed!\n");
return -1;
}
initgraph(&i,&j,"");
while(*chi)
{
sec = *chi-0xa0; /*獲得區碼*/
pot = *(chi+1)-0xa0; /*獲得位碼*/
fseek(HZK,(94*(sec-1)+(pot-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i] & (0x80 >> k)) /*測試為1的位則顯示*/
putpixel(X+i*8+k,Y+j,WHITE);
X += WIDTH; /*下一字元的橫坐標*/
if(X >= MAXX)
{
X = 0;
Y += HIGH; /*下一字元的縱坐標*/
if(Y >= MAXY) /*滿一頁*/
{
printf("press any key to print other words");
getch();
system("cls"); /*清屏*/
Y = 0;
}
}
chi += 2; /*指針指向下一中文字元*/
}
getchar();
closegraph();
fclose(HZK);
return 0;
}
Ⅱ C語言 如何輸入漢字
需要准備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp。
Ⅲ c語言怎樣才能輸出中文(最簡單的方法)
定義一個字元串變數,在這個變數的值中就可以輸入中文了。漢字是多位元組的,一個char放不下,可以使用字元數組,但需要給數組分配空間,或者使用string。
例如:
#include<stdio.h>
int main(void)
{
char a[128];
printf("請輸入所需輸出的漢字:");
scanf("%s",a);
printf("%s\n",a);
return 0;
Ⅳ 請問在C語言中如何輸出漢字
1、引入標准輸入輸出庫:sdtio.h。
2、定義字元串形式的漢字(採用字元數組存儲)。
3、使用printf函數,或者puts函數輸出字元串形式的漢字。
例如:
#include<stdio.h>
intmain()
{
charstr[]="輸出漢字";
printf("%s ",str);
puts(str);
return0;
}
/*
運行結果:
輸出漢字
輸出漢字
*/
Ⅳ c語言編程中,怎麼輸入輸出 姓名,漢字。
如果您是用TC進行編程,那麼只能顯示英文,如果您是用VC進行編程就可以顯示中文了。兩者只是編譯工具不一樣,編程語言的使用是一樣的。
代碼如下:
#include<stdio.h>
#include<string.h>
int main(){
char name[6][20];
char temp[20];
printf("請輸入6個人的名字: ");
int i;
for (i = 0; i < 6; i++){
gets(name[i]);
}
printf(" 這六個人的名字如下: ");
for (i = 0; i < 6; i++){
printf("%s ", name[i]);
}
printf(" ");
printf("按字典排序後如下所示: ");
int j, k;
for (j = 0; j < 6; j++)
for (k = j + 1; k < 6; k++)
{
if (strcmp(name[j], name[k])>0)
{
strcpy(temp, name[j]);
strcpy(name[j], name[k]);
strcpy(name[k], temp);
}
}
for (i = 0; i < 6; i++)
printf("%s ", name[i]);
}
拓展資料
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
Ⅵ c語言中如何打出中文
1、中文字元串可以使用printf()、puts()等函數直接輸出。
#include <stdio.h>
#include <locale.h>
int main()
{
const char str[] = "這里全是中文";
printf("\n輸出字元數:%d\n", printf(str));
puts(str);
return 0;
}2、單個中文字元,需要進行本地化設置,需要使用寬字元版的printf()即wprintf輸出。
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "chs");
wchar_t wc = L'中';
wprintf(L"%c\n",wc);
return 0;
}