當前位置:首頁 » 編程語言 » c語言顯示漢字

c語言顯示漢字

發布時間: 2022-04-06 21:39:06

1. c語言出現漢字。。

很正常,這是在漢字狀態下顯然的結果。
由於程序連續顯示兩個大於127的字元型數值,系統認為這是一個漢字,而顯然漢字"壙"的內碼就是219,219.

2. c語言怎樣才能輸出中文(最簡單的方法)

起初,C語言沒有官方標准。1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。布萊恩·柯林漢(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本書,名叫《The C Programming Language》。

這本書被 C語言開發者們稱為K&R,很多年來被當作 C語言的非正式的標准說明。人們稱這個版本的 C語言為K&R C。

K&R C主要介紹了以下特色:

結構體(struct)類型

長整數(long int)類型

無符號整數(unsigned int)類型

把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上產生混淆。

即使在後來ANSI C標准被提出的許多年後,K&R C仍然是許多編譯器的最 准要求,許多老舊的編譯器仍然運行K&R C的標准。

1970到80年代,C語言被廣泛應用,從大型主機到小型微機,也衍生了C語言的很多不同版本。

1983年,美國國家標准協會(ANSI)成立了一個委員會X3J11,來制定 C語言標准。

1989年,美國國家標准協會(ANSI)通過了C語言標准,被稱為ANSI X3.159-1989 "Programming Language C"。因為這個標準是1989年通過的,所以一般簡稱C89標准。有些人也簡稱ANSI C,因為這個標準是美國國家標准協會(ANSI)發布的。

1990年,國際標准化組織(ISO)和國際電工委員會(IEC)把C89標準定為C語言的國際標准,命名為ISO/IEC 9899:1990 - Programming languages -- C 。

因為此標準是在1990年發布的,所以有些人把簡稱作C90標准。不過大多數人依然稱之為C89標准,因為此標准與ANSI C89標准完全等同。

1994年,國際標准化組織(ISO)和國際電工委員會(IEC)發布了C89標准修訂版,名叫ISO/IEC 9899:1990/Cor 1:1994,有些人簡稱為C94標准。

1995年,國際標准化組織(ISO)和國際電工委員會(IEC)再次發布了C89標准修訂版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity [7] ,有些人簡稱為C95標准。

3. C語言編程出現漢字輸出亂碼現象

C語言中一個漢字是由兩個位元組來表示的
而C語言編程主要是以位元組為單位來顯示
所以你的C語言輸出中,如果漢字顯示只顯示了一個位元組,就會有亂碼出現了
正常的做法是,你的printf輸出時,符號的長度要為偶數位元組。

4. c語言編程如何輸出漢字

Windows XP與DOS是完全不同的兩種內核。Windows XP幾乎把DOS完全摒棄了。
而TC則是DOS時代的遺留物。

所以用TC編出來的程序在WINDOWS XP中運行時,許可權是非常有限的。特別是對屏幕的操作。所以畫點陣的方法是行不通的(更何況這個方法編出的程序也是很復雜的)。如果你用的是98以前的操作系統的話,用UCDOS就可以實現,但在XP中UCDOS已經不能用了。

如果想要用C語言編程時輸出漢字,可以用以下幾種方法:
1.最值得推薦的一種。摒棄TC,改用為WINDOWS編程設計的Visual C++,或者C++ Builder,lcc等。
用這幾種工具的話,在代碼中可以直接輸入漢字。編譯出來的是32位windows程序不存在兼容問題。

2.改用98以前的操作系統。
3.裝個虛擬機,在虛擬機中裝上DOS或者98。當然還要裝上UCDOS。然後,在其中用TC寫程序。

5. 急!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;
}

6. C語言如何實現顯示漢字

用字型檔,實際上就是描點,比如對於一個8*8的小格子裡面,你如果只有第3和第4行是黑的,其它是白的,那麼我們肉眼看起就可能像個「一」字。
建議去載一下win-tc,它那裡面有一個漢字點陣生成器(如果不載WIN-tc的話,還要自己去字型檔文件找區位碼,麻煩),
PS:win-tc下面的漢字點陣生成器會跟你講代碼怎麼用。

7. C語言怎樣顯示GBK漢字

是顯示在命令行、還是按點陣來顯示呢

要是前者,直接printf("中文") 就是

~
~
~

8. 請問在C語言中如何輸出漢字

1、引入標准輸入輸出庫:sdtio.h。

2、定義字元串形式的漢字(採用字元數組存儲)。

3、使用printf函數,或者puts函數輸出字元串形式的漢字。

例如:

#include<stdio.h>
intmain()
{
charstr[]="輸出漢字";
printf("%s ",str);
puts(str);
return0;
}
/*
運行結果:
輸出漢字
輸出漢字
*/

9. 怎樣用C語言編寫出能夠顯示漢字的程序,給舉個例子好嗎

用單片機驅動點陣液晶 很簡單的哦 哈哈
不過想在Turbo C下可以這樣
在許多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編譯系統下運行成功,它可以將漢字放大顯示,讀者可以將它改成函數用在您的程序中顯示漢字。

熱點內容
伺服器共享文件如何查看訪問記錄 發布:2025-01-19 10:08:55 瀏覽:400
datasourceSQL 發布:2025-01-19 10:01:25 瀏覽:838
aspnet網站的編譯 發布:2025-01-19 10:00:49 瀏覽:334
路特仕A9工廠密碼是多少 發布:2025-01-19 09:59:44 瀏覽:257
linux的命令find 發布:2025-01-19 09:42:55 瀏覽:174
簡單的計算機編程 發布:2025-01-19 09:39:54 瀏覽:520
c語言table 發布:2025-01-19 09:27:50 瀏覽:953
java8gc 發布:2025-01-19 09:03:30 瀏覽:648
mac個人收藏添加文件夾 發布:2025-01-19 08:55:12 瀏覽:531
股票編程書籍 發布:2025-01-19 08:55:01 瀏覽:120