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