李翠蓮
(呂梁學(xué)院離石師范分校, 山西 呂梁 033000)
在日常工作生活中,利用各種應(yīng)用軟件進(jìn)行文書編輯時(shí),文字的輸入通常采用各種鍵盤輸入法、利用讀卡機(jī)進(jìn)行轉(zhuǎn)換識(shí)別、語(yǔ)音識(shí)別、現(xiàn)今流行的圖像識(shí)別技術(shù)(利用圖片識(shí)別文字)等輸入法,盡管各種方式的輸入技術(shù)不同,但實(shí)現(xiàn)的核心技術(shù)是漢字編碼。漢字在信息處理系統(tǒng)中,要經(jīng)過(guò)編碼、輸入、匹配編碼、傳輸、轉(zhuǎn)化和字符碼輸出環(huán)節(jié),這些環(huán)節(jié)的關(guān)鍵技術(shù)是編碼,漢字編碼技術(shù)現(xiàn)今比較成熟,在現(xiàn)階段仍然采用通過(guò)漢字編碼方式作為漢字輸入計(jì)算機(jī)的基本方式。
中國(guó)漢字的特點(diǎn):總數(shù)超過(guò)6萬(wàn)個(gè)(包括簡(jiǎn)化字、繁體字),通過(guò)學(xué)者研究規(guī)定常用漢字3000-4000個(gè),但仍比二三十個(gè)英文字母處理要復(fù)雜得多;漢字字形復(fù)雜,有古體、繁體、簡(jiǎn)體、正體、異體等字形,筆畫相差大,少的只有一筆,多的多達(dá)36筆,簡(jiǎn)化后的字符編碼平均為9.8筆;漢語(yǔ)音節(jié)416個(gè),分聲調(diào)后為1295個(gè),以10000個(gè)漢字為例計(jì)算,每個(gè)不帶音調(diào)的漢字平均24個(gè)以上、帶調(diào)音節(jié)平均7.7個(gè)以上,個(gè)別同音同調(diào)字達(dá)66個(gè)以上,存在大量的同音異字、同字異音,給編碼帶來(lái)諸多困難。
計(jì)算機(jī)基于二進(jìn)制編碼設(shè)計(jì),漢字在需要進(jìn)行人為編制為二進(jìn)制編碼。我國(guó)根據(jù)計(jì)算機(jī)應(yīng)用需求的不同,漢字編碼通常分為輸入碼(也稱外碼)、交換碼(國(guó)標(biāo)碼)、機(jī)內(nèi)碼和字形碼。
輸入碼通常是用戶利用計(jì)算機(jī)鍵盤輸入到計(jì)算機(jī)中的一組符號(hào)編碼,也就是各種輸入法如搜狗五筆輸入法、微軟拼音輸入法、區(qū)位碼輸入法,輸入碼的編碼要求規(guī)則簡(jiǎn)單,易學(xué)易用、操作簡(jiǎn)單、重碼率低、輸入速度快,用戶可以根據(jù)自己需要選擇合適的輸入碼。
計(jì)算機(jī)中信息處理均采用二進(jìn)制代碼來(lái)表示,漢字也采用二進(jìn)制,由于二進(jìn)制代碼使用不方便,國(guó)家標(biāo)準(zhǔn)局制定了漢字編碼的國(guó)家標(biāo)準(zhǔn):國(guó)家標(biāo)準(zhǔn)GB2312-80(國(guó)標(biāo)碼)。國(guó)標(biāo)碼將漢字編碼分為兩級(jí):一級(jí)為常用漢字共 3755個(gè),按拼音英文字母順序排列;二級(jí)為次常用漢字共3008個(gè),按部首/筆畫順序排列,這種編碼即區(qū)位碼。
區(qū)位碼是國(guó)標(biāo)碼的一種表現(xiàn)形式,其特點(diǎn)是采用行列式(即二維坐標(biāo)形式,行表示區(qū)、列表示位),這種表示法重碼率低。國(guó)標(biāo)GB2312-80中,漢字圖形符號(hào)由94×94組成一個(gè)方陣,共分為94個(gè)“區(qū)”,94個(gè)“位”,區(qū)號(hào)、位號(hào)從01至94進(jìn)行編號(hào)。94個(gè)區(qū)與94個(gè)位共編出總數(shù)為94×94=8836個(gè)編碼,其中規(guī)定7445個(gè)為常用漢字和圖形字符,01-09區(qū)為符號(hào)、數(shù)字區(qū),16-87區(qū)為漢字區(qū),10-15區(qū)、88-94區(qū)為空白區(qū),便于擴(kuò)充和構(gòu)造特殊漢字使用。
國(guó)標(biāo)GB2312-80中規(guī)定,每一個(gè)漢字和圖形符號(hào)都有唯一確定的二進(jìn)制編碼,在計(jì)算機(jī)內(nèi)部和磁盤上記錄漢字和圖形都采用機(jī)內(nèi)碼表示,漢字在計(jì)算機(jī)中采用兩個(gè)字節(jié)處理和存儲(chǔ)機(jī)內(nèi)碼。根據(jù)國(guó)標(biāo)GB2312-80中規(guī)定,從區(qū)位碼到機(jī)內(nèi)碼轉(zhuǎn)換算法,區(qū)碼+32和位碼+32轉(zhuǎn)換為國(guó)標(biāo)碼,國(guó)標(biāo)碼區(qū)碼+128和國(guó)標(biāo)碼位碼+128轉(zhuǎn)換為機(jī)內(nèi)碼。
漢字字型碼用于在輸出設(shè)備進(jìn)行輸出,通常采用矢量和點(diǎn)陣兩種方式表示。
矢量表示方式以描述漢字字型的輪廓為特征,在輸出漢字時(shí),通過(guò)算法計(jì)算漢字字型輪廓,生成所需大小和形狀漢字點(diǎn)陣。采用矢量化字型描述漢字字形,文字大小與顯示器分辨率無(wú)關(guān),字形輸出質(zhì)量高,無(wú)失真。在Windows中TrueType技術(shù)是矢量漢字字形碼表示方式。
點(diǎn)陣字型碼采用漢字字型點(diǎn)陣進(jìn)行編碼。根據(jù)漢字輸出的要求不同,點(diǎn)陣字形碼有16*16、24*24、32*32、48*48點(diǎn)陣等等,點(diǎn)陣規(guī)模愈大,輸出字型越清晰美觀,所占存儲(chǔ)空間也越大。
漢字地址碼為了簡(jiǎn)化內(nèi)碼到地址碼轉(zhuǎn)化,它與漢字機(jī)內(nèi)碼是一一對(duì)應(yīng)關(guān)系,是漢字庫(kù)存儲(chǔ)字形碼信息的邏輯地址。
在《計(jì)算機(jī)基礎(chǔ)》課程教學(xué)中,漢字編碼知識(shí)從理論上如何利用二進(jìn)制進(jìn)行漢字編碼及應(yīng)用給學(xué)生進(jìn)行了講解,在實(shí)際教學(xué)中發(fā)現(xiàn),學(xué)生對(duì)該部分理論知識(shí)缺乏直觀認(rèn)識(shí),對(duì)二進(jìn)制理解不透徹,學(xué)習(xí)興趣不高,《計(jì)算機(jī)基礎(chǔ)》不涉及編程內(nèi)容,不能進(jìn)行實(shí)踐驗(yàn)證。C語(yǔ)言編譯簡(jiǎn)易、代碼效率高、有豐富的運(yùn)算符,處理低級(jí)存儲(chǔ)器功能強(qiáng)大(字節(jié)處理和位處理能力強(qiáng)大),具有豐富的數(shù)據(jù)類型和強(qiáng)大邏輯控制能力。在《C程序設(shè)計(jì)》課程教學(xué)過(guò)程中結(jié)合《計(jì)算機(jī)基礎(chǔ)》課程所學(xué)漢字編碼知識(shí),利用《C程序設(shè)計(jì)》的強(qiáng)大編程功能實(shí)現(xiàn)漢字編碼的驗(yàn)證教學(xué),從而提高學(xué)生學(xué)習(xí)的積極性。具體可以采用如下代碼實(shí)現(xiàn)區(qū)位碼和漢字的互換:
主要算法是:區(qū)機(jī)內(nèi)碼=區(qū)碼+32+128,位機(jī)內(nèi)碼=位碼+32+128,具體代碼如下,其運(yùn)行結(jié)果如圖1所示。
圖1 區(qū)位碼轉(zhuǎn)化為漢字運(yùn)行結(jié)果
#include
void main()
{
int quma,weima;//聲明區(qū)號(hào)和位號(hào)兩個(gè)變量
int qm,wm,count=0;
for(quma=16;quma<=94;quma++) //利用遍歷算法遍歷區(qū)號(hào)
for(weima=1;weima<=94;weima++) ////利用遍歷算法遍歷位號(hào)
{
qm=quma+32+128; //區(qū)碼+32+128變?yōu)闄C(jī)內(nèi)碼
wm=weima+32+128; //位碼+32+128變?yōu)闄C(jī)內(nèi)碼
printf("%c%c",qm,wm);//利用(char)轉(zhuǎn)換強(qiáng)制把區(qū)碼、位碼加160后轉(zhuǎn)換為機(jī)內(nèi)碼
count++;
//每行顯示25個(gè)漢字
if(count%25==0)
printf(" ");
}
}
漢字到區(qū)位碼轉(zhuǎn)換是漢字編碼的逆運(yùn)算,即區(qū)碼=區(qū)機(jī)內(nèi)碼-160,位碼=位機(jī)內(nèi)碼-160,其結(jié)果如圖2所示。
#include
#include
int main()
{
char hanzi[200];//定義存儲(chǔ)字符串?dāng)?shù)組
int lenHZ;//定義存儲(chǔ)字符串長(zhǎng)度變量
int i; //遍歷字符串?dāng)?shù)組變量
printf("請(qǐng)輸入漢字,不超過(guò)99個(gè): ");
scanf("%s",hanzi); //輸入字符串
printf("輸出漢字對(duì)應(yīng)的區(qū)位碼: ");
lenHZ = strlen(hanzi); //求字符串長(zhǎng)度
//輸出漢字代碼 for(i=0;i { printf(" ");//格式控制 printf("%c%c",hanzi[i],hanzi[i+1]);//漢字輸出 printf(" ");//格式控制 } printf("
"); //輸出區(qū)位碼代碼 for(i=0;i { //格式控制 if(i%2==0) { printf(" "); } printf("%02d",(unsigned char)(hanzi[i])-160); //字符到區(qū)碼轉(zhuǎn)換 printf("%02d",(unsigned char)(hanzi[i+1])-160);//字符到位碼轉(zhuǎn)換 } printf("
"); } 本文利用《計(jì)算機(jī)基礎(chǔ)》課程內(nèi)容中漢字編碼算法,結(jié)合《C程序設(shè)計(jì)》課程強(qiáng)大編程功能,實(shí)現(xiàn)了漢字與區(qū)位碼的互換,使理論與實(shí)踐相結(jié)合,極大提高了學(xué)生學(xué)習(xí)的積極性。該代碼實(shí)現(xiàn)的同時(shí)可以作為實(shí)際應(yīng)用程序:區(qū)位碼查詢軟件。這樣既解決了教學(xué)中存在的不足,又解決了區(qū)位碼查詢問(wèn)題,提高了區(qū)位碼查詢的效率和準(zhǔn)確率。四、結(jié)語(yǔ)