黃小花
摘要:該文圍繞了漢字的編碼過程,詳細(xì)介紹了輸入碼、區(qū)位碼、國標(biāo)碼、機(jī)內(nèi)碼、字形碼的編碼方法。輸入碼是為方便漢字輸入而形成的漢字編碼為,國標(biāo)碼是為表示漢字而統(tǒng)一的編碼,計(jì)算機(jī)還不能將國標(biāo)碼作為漢字在計(jì)算機(jī)中的表現(xiàn)形式,因?yàn)闀?huì)和ASCII碼發(fā)生沖突,所以又產(chǎn)生了漢字的機(jī)內(nèi)碼,機(jī)內(nèi)碼是存儲(chǔ)漢字的編碼,最終漢字是通過字形碼或輸出碼將漢字輸出。
關(guān)鍵詞:漢字的編碼;國標(biāo)碼;機(jī)內(nèi)碼; 字形碼
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)04-0181-02
Abstract: This paper around the coding process Chinese characters, detailed introduces the coding method for input code, area code, GB code, machine code, shape code. The input code is formed Chinese characters code for the convenience of Chinese characters input, GB code is unified for the said Chinese characters coding, computer can be GB code as a form Chinese characters in the computer, because ASCII codes and conflict, so they produced a Chinese characters within the machine code, machine code is only, font code is Chinese characters coding form to display and print output Chinese characters.
Key words: Chinese characters coding; GB code; machine code; font code
計(jì)算機(jī)是二進(jìn)制世界,只能識(shí)別由0和1組成的二進(jìn)制度,所有外部信息都要編碼成二進(jìn)制。如將十進(jìn)制數(shù)通過數(shù)值轉(zhuǎn)換編碼成二進(jìn)制,將西文字符通過ASCII碼編碼成二制,將聲音、圖像通過數(shù)/模轉(zhuǎn)換編碼成二進(jìn)制度。
大多數(shù)情況下,我們輸入的是漢字,漢字從進(jìn)入計(jì)算機(jī)內(nèi)部處理完畢到輸出,同樣需要進(jìn)行編碼。
1 漢字的輸入碼
用戶選擇輸入法從鍵盤上把漢字輸入計(jì)算機(jī)時(shí)所用的編碼叫輸入碼,所以輸入碼是負(fù)責(zé)將漢字輸入計(jì)算機(jī)而采用的編碼。輸入碼與輸入法有關(guān),輸入法不同,輸入碼的編碼也是不同的。目前常用的輸入法有音碼類、形碼類、音形混合類等多種輸入法。用戶可以選擇一種或多種熟悉的輸入法來輸入漢字,而每種輸入法的編碼是不同的。如采用拼音輸入法輸入“裝”字的編碼為“zhuang”,而采用五筆輸入法輸入“裝”字的編碼為“ufy”,這說明漢字的輸入碼不是唯一的,它是一種外碼,同一個(gè)字的輸入碼可以有多種不同的編碼。
2 漢字的國標(biāo)碼與區(qū)位碼
有由于漢字編碼方案眾多,各種方案又各有千秋,為了使?jié)h字有一個(gè)統(tǒng)一的編碼,我國在1980年頒布了漢字的編碼標(biāo)準(zhǔn)即中華人民共和國標(biāo)準(zhǔn)交換代碼,簡(jiǎn)稱為國標(biāo)碼,代號(hào)GB2312-80。國標(biāo)碼規(guī)定一個(gè)漢字用2個(gè)字節(jié)表示,前一個(gè)字節(jié)表示區(qū)號(hào),后一個(gè)字節(jié)表示位號(hào),于是又得到了區(qū)位碼。區(qū)位碼中有94個(gè)區(qū)號(hào),94個(gè)位號(hào),用區(qū)號(hào)*位號(hào)就可得到一張區(qū)位碼表,即94*94=8836的區(qū)位碼表,在這個(gè)區(qū)位碼表中有8836個(gè)區(qū)位。在這些區(qū)位中分布了6763個(gè)漢字,682個(gè)圖形字符,還有一些空的區(qū)位,留待擴(kuò)展使用。
國標(biāo)是在漢字的區(qū)位碼基礎(chǔ)上得到的,只需要十進(jìn)制的區(qū)位碼的區(qū)號(hào)加32,同時(shí)位號(hào)加32就得到了漢字的國標(biāo)碼。國標(biāo)碼中將6763個(gè)漢字分成了兩級(jí)漢字,其中一級(jí)漢字有3755個(gè),它們是平時(shí)使用頻率最高的漢字,在表中是按拼音排序的;二級(jí)漢字有3008個(gè),它們是次常用漢字,在表中按部首/筆畫順序排列。
給出一個(gè)漢字,如何得到區(qū)位碼和國標(biāo)碼呢?我們可以先通過區(qū)位碼表查出該漢字的區(qū)位碼,如“?!弊痔幱趨^(qū)位碼的第17區(qū)第3位,即區(qū)位碼為“1703”。再將區(qū)碼17+32=47,位號(hào)03+32=35,即可得出“?!弊值膰鴺?biāo)碼為“4735”。任意一個(gè)漢字只要先查出區(qū)位碼,即可得出國標(biāo)碼。
3 國標(biāo)碼與區(qū)位碼之間的關(guān)系
每個(gè)國標(biāo)碼或區(qū)位碼都對(duì)應(yīng)著一個(gè)唯一的漢字或符號(hào),他們的編碼方法相同,都是用2個(gè)字節(jié)來代碼組成,每個(gè)字節(jié)的最高位都置0,其余14位二進(jìn)制表示的編碼。但是國標(biāo)碼并不等于區(qū)位碼,兩者間的區(qū)別在于:
第一,兩者表示時(shí)采用的進(jìn)位計(jì)數(shù)制不同。國標(biāo)碼采用四位的十六進(jìn)制數(shù)表示,而區(qū)位碼采用四位的十進(jìn)制數(shù)表示。因?yàn)槭M(jìn)制數(shù)我們很少用到,所以大家常用的是區(qū)位碼。
第二,區(qū)位碼表示的范圍比國標(biāo)碼更寬。在GB-2312中預(yù)留了一些空區(qū)位,可以進(jìn)行補(bǔ)充、擴(kuò)展,經(jīng)擴(kuò)展的區(qū)位碼從數(shù)量、范圍上超過了GB-2312國標(biāo)碼。如區(qū)位碼中有8836個(gè)區(qū)位,國標(biāo)碼使用了其中的7445個(gè)區(qū)位來表示漢字和圖形符號(hào)。
第三,國標(biāo)碼是在區(qū)位碼的基礎(chǔ)上得到,其具體過程如下:首先將十進(jìn)制的區(qū)位碼區(qū)號(hào)轉(zhuǎn)換為十六進(jìn)制后加20H,再將十進(jìn)制的區(qū)位碼位號(hào)轉(zhuǎn)換為十六進(jìn)制后加20H,最后將轉(zhuǎn)換后的兩部分合在一起即可得到十六進(jìn)制的國標(biāo)碼。
例如:“?!弊值膰鴺?biāo)碼為3123H ,它是經(jīng)過下面的轉(zhuǎn)換得到的:“?!弊值膮^(qū)位碼是1703,分別將其區(qū)號(hào)17,轉(zhuǎn)化為十六進(jìn)制11H,位號(hào)03轉(zhuǎn)換成十六進(jìn)制03H,即1103H,然后,再對(duì)區(qū)號(hào)和位號(hào)分別加上20H,得到“?!弊值膰鴺?biāo)碼:3123H
4 漢字的機(jī)內(nèi)碼
國標(biāo)碼僅能作為表示一個(gè)漢字的編碼,漢字最終存儲(chǔ)時(shí)不能使用國標(biāo)碼。漢字最終在計(jì)算機(jī)內(nèi)部存儲(chǔ)、加工、處理時(shí)需要使用漢字的機(jī)內(nèi)碼。
國標(biāo)碼的編碼并不能唯一確定一個(gè)漢字。如前所述國標(biāo)碼用2個(gè)字節(jié)來表示一個(gè)漢字,每個(gè)漢字的最高字節(jié)是0,其余用不同的7位碼值表示。這種編碼會(huì)和西文字符編碼ASCII碼產(chǎn)生沖突。ASCII碼是對(duì)字符的編碼,規(guī)定一個(gè)字符用1個(gè)字節(jié)表示,該字節(jié)最高位是0,其余7位用不同的碼值表示,兩種編碼中,因其前后字節(jié)的最高位為0,這樣有會(huì)出現(xiàn)一個(gè)漢字的國標(biāo)碼可能會(huì)與兩個(gè)字符的ASCII碼相同,從而導(dǎo)致國標(biāo)碼會(huì)與ASCII碼發(fā)生沖突。如“?!弊郑瑖鴺?biāo)碼為00110001和00100011,而西文字符“1”和“#”的ASCII也為00110001和00100011,這時(shí)內(nèi)存中的兩個(gè)字節(jié)00110001和00100011,表示的到底是一個(gè)漢字“?!边€是兩個(gè)西文字符“1”和“#”,于是就出現(xiàn)了每個(gè)字符或漢字編碼不唯一,產(chǎn)生歧義。顯然,國標(biāo)碼是不可能在計(jì)算機(jī)內(nèi)部直接采用的,他只能作為表示漢字的一種編碼,漢字在計(jì)算機(jī)內(nèi)部的編碼應(yīng)采用機(jī)內(nèi)碼。
機(jī)內(nèi)碼與國標(biāo)碼之間存在著必然的聯(lián)系。漢字的機(jī)內(nèi)碼采用變形國標(biāo)碼,是在國標(biāo)碼的基礎(chǔ)上變換得到的,其變換方法為:即將兩個(gè)字節(jié)的國標(biāo)碼每個(gè)字節(jié)的最高位由0改為1,2個(gè)字節(jié)除最高位之處的其余7位碼值不變。顯然,漢字機(jī)內(nèi)碼的兩個(gè)字節(jié)的每個(gè)字節(jié)的最高位都是1,而西文字符字節(jié)的最高位為0,使得機(jī)內(nèi)碼的編碼得到唯一,從而解決了與西文字符的ASCII碼沖突的問題。
如:由上面我們知道,“?!弊值膰鴺?biāo)碼為00110001和00100011,第1字節(jié)為00110001B,第為字節(jié)為00100011B,要得到“?!弊值臋C(jī)內(nèi)碼只需將兩個(gè)字節(jié)的高位由0改1為,其余碼值不變,即得到10110001B和10100011B 即為B1A3H,因此,漢字的機(jī)內(nèi)碼就是B1A3H。
漢字的機(jī)內(nèi)碼一般用十六進(jìn)制表示,從十六制表示方法看, 漢字兩字節(jié)的機(jī)內(nèi)碼和國標(biāo)碼每個(gè)字節(jié)這間相差80H,兩者之間的等價(jià)的對(duì)應(yīng)關(guān)系為:國標(biāo)碼+8080(H)=機(jī)內(nèi)碼
5 漢字字形碼
一個(gè)漢字不但要通過輸入碼輸入計(jì)算機(jī)、用國標(biāo)碼表示出來、用機(jī)內(nèi)碼存儲(chǔ),最終漢字還需要輸出來,負(fù)責(zé)將漢字輸出來的編碼叫輸出碼或字形碼。
漢字輸出時(shí)采用的是點(diǎn)陣圖,即將一個(gè)漢字放在一個(gè)M行N列的圓點(diǎn)組成的方塊(稱為漢字的字模點(diǎn)陣),那么每個(gè)漢字都可以用點(diǎn)陣中的一些點(diǎn)組成。每個(gè)點(diǎn)用一位二進(jìn)制表示,有筆形的為1,否則為0,就可得到該漢字的字形碼。
采用點(diǎn)陣圖將一個(gè)漢字輸出,點(diǎn)陣中的每一個(gè)點(diǎn)對(duì)應(yīng)存儲(chǔ)器中的一位,如用16*16點(diǎn)陣將一個(gè)漢字輸出,其用到256個(gè)點(diǎn),即256位。由于計(jì)算機(jī)中,8個(gè)二進(jìn)制位作為一個(gè)字節(jié),所以16*16點(diǎn)陣漢字需要32字節(jié)存儲(chǔ)一個(gè)漢字。24*24點(diǎn)陣漢字需要72字節(jié),32*32點(diǎn)陣漢字需要128字節(jié),48*48點(diǎn)陣漢字需要288字節(jié)……點(diǎn)陣數(shù)越大,分辨率越高,字形越美觀,但占用的存儲(chǔ)空間越多。
采用點(diǎn)陣方式輸出漢字,編碼、存儲(chǔ)方式簡(jiǎn)單、無需轉(zhuǎn)換直接輸出,但放大后產(chǎn)生的效果差。
參考文獻(xiàn):
[1] 楊飛宇.計(jì)算機(jī)應(yīng)用基礎(chǔ)教程[M].北京:機(jī)械工業(yè)出版社,2010.
[2] [美]Julia編著 .Visual Basic 6.0高級(jí)編程[M].北京:清華大學(xué)出版社, 2003.
[3] 劉勇.計(jì)算機(jī)應(yīng)用基礎(chǔ)教程[M].北京:水利水電出版社,2011.
[4] 鄭有增,許文憲.Visual Basic程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005.
[5] 百度百科:漢字編碼http://baike.baidu.com/view/391899.ht.