一、漢字的編碼
1.國標(biāo)碼
“中華人民共和國國家標(biāo)準(zhǔn)信息交換漢字編碼”,標(biāo)準(zhǔn)號GB2312-80。該編碼字符集收錄了一級漢字3755個,二級漢字3008個,圖形符號682個,共7445個。
在GB2312-80代碼表中,縱向分為0~93,共94行;橫向也是0~93,共94列。行與列分別用7位二進制碼表示,第一字節(jié)表示行,第二字節(jié)表示列。其值從0100001到1111110(十六進制為21-7E)。這正是ASCII碼的可打印字符的編碼范圍。國標(biāo)碼是將第一字節(jié)和第二字節(jié)連寫而得,習(xí)慣上稱第一字節(jié)為“高字節(jié)”,第二字節(jié)為“低字節(jié)”,一般用十六進制表示。
2.區(qū)位碼
整個代碼表分為94個區(qū)(對應(yīng)高字節(jié)),每個區(qū)94個位(對應(yīng)低字節(jié)),合起來就是區(qū)位碼,按如下規(guī)則確定:
高位內(nèi)碼=高字節(jié)國標(biāo)碼-20H
低位內(nèi)碼=低字節(jié)國標(biāo)碼-20H
例如,漢字“啊”在16行的第l列,則它的區(qū)位碼是“1001H”。
注:區(qū)位碼的高字節(jié)和低字節(jié)的取值范圍均是01H~5EH。
3.機內(nèi)碼
也就是內(nèi)碼。漢字區(qū)位碼的區(qū)碼和位碼的范圍在1~94內(nèi),如果直接作為機內(nèi)碼必將與基本的ASCII碼沖突。為避免與基本ASCII碼中的控制碼與字符碼的沖突,分別在區(qū)碼、位碼上增加A0H(即10100000)。所以,內(nèi)碼同樣占兩個字節(jié),分別稱為高位內(nèi)碼與低位內(nèi)碼,按如下規(guī)則確定:
高位內(nèi)碼=區(qū)碼+A0H
低位內(nèi)碼=位碼+A0H
例如,漢字“啊”的內(nèi)碼是“B0A1H”(即1011000010100001)。
注:高位內(nèi)碼與低位內(nèi)碼的取值范圍均是A1H~FEH。
二、漢字的輸出顯示
漢字的輸出主要是指漢字字形的輸出,方式主要是顯示和打印兩種。實際上,每一個漢字都是一個特定的圖形,用一個點陣來表示。點陣的每個點位只有兩種狀態(tài):有點或無點。若用二進制代碼來表示即為該位取值為1 表示有點,取值為0表示無點。
例如,如果用16×16點陣來表示一個漢字,則該漢字圖形由16行16列共256個點構(gòu)成,這256個點需用256個二進制的位來描述,需要32個字節(jié)來存儲用于存放圖形信息,這樣的二進制代碼串稱為漢字的“字?!?。
所有漢字和各種符號的點陣信息就組成漢字的“字模庫”(簡稱字庫)。字模的表示順序為:先從左到右,再從上到下。也就是先畫第一行左上方的8個點,再是右上方的8個點,然后是第二行左邊8個點,右邊8個點,以此類推。
三、漢字的顯示原理
1.從鍵盤輸入的漢字經(jīng)過鍵盤管理模塊,變換成機內(nèi)碼。
2.然后經(jīng)字模檢索程序,查到機內(nèi)碼對應(yīng)的點陣信息在字模庫的地址。
3.從字庫中檢索出該漢字點陣信息。
4.利用顯示驅(qū)動程序?qū)⑦@些信息送到顯示卡的顯示緩沖存儲器中。
5.顯示器的控制器把點陣信息整屏順次讀出,并使每一個二進制位與屏幕的一個點位相對應(yīng),就可以將漢字字形在屏幕上顯示出來。
四、用區(qū)位碼獲取漢字的點陣信息
以16×16的點陣漢字庫文件為例。一個漢字用了256個點共32個字節(jié)表示。漢字共分94區(qū),每個區(qū)有94位漢字。機內(nèi)碼用兩個字節(jié)表示,第一個字節(jié)存儲區(qū)號(qh),為了和ASCII碼相區(qū)別,范圍從十六進制的A1H開始(小于80H地為ASCII碼字符),對應(yīng)區(qū)碼的第一區(qū);第二個字節(jié)是位號(wh),范圍也從A1H開始,對應(yīng)某區(qū)中的第一個位碼。這樣,將漢字機內(nèi)碼減去A0A0H就得到該漢字的區(qū)位碼。從而可以得到漢字在字庫中的具體位置:
位置=(94*(qh-1) + wh-1) * 一個漢字字模占用的字節(jié)數(shù)
對于16×16的點陣漢字庫,漢字在字庫中的具體位置的計算公式就是:(94*(qh-1)+wh-1)*32。例如,“房”的機內(nèi)碼為十六進制的B7BF,則其區(qū)位碼是B7BFH-A0A0H=171FH,轉(zhuǎn)化為十進制就是2331,在漢字庫中的位置就是32*[94*(23-1)+(31-1)]=67136字節(jié)以后的32個字節(jié)為“房”的顯示點陣。
自己寫的一個demo,抓取漢字的ASC值:
可以看到用ASC方法抓取的ASCII的值是-12590,是一個負(fù)數(shù)。
ASCW返回的是Unicode(寬型)字符代碼,抓取的值是25105。
說到ASCII值,介紹幾個方法:
Asc、AscB、AscW 是 VBScript 中的三個函數(shù),其區(qū)別如下。
Asc(string) 返回與字符串的第一個字母對應(yīng)的 ANSI 字符代碼。返回值:英文 >0,中文 <0。
AscB(binstr) 適用于二進制數(shù)據(jù)。AscB 不是返回第一個字符的字符代碼,而是返回首字節(jié)。
AscW(string) 是為使用 Unicode 字符的 32 位平臺提供的。它返回 Unicode (寬型)字符代碼,因此可以避免從 ANSI 到 Unicode 的代碼轉(zhuǎn)換。