漢字取模方法
(作者未知) 2009/12/21
一、VB6對漢字處理的支持
對漢字處理,VB6主要是提供了一些輸入法設置方面的支持。它提供了一個ImeMode屬性和ImeStatus函數(shù)來確定和設置輸入法的狀態(tài)。而且此屬性和方法只在VB6的東亞區(qū)版本中有效。
IMEStatus函數(shù)返回一個整數(shù),用來指定當前Windows的輸入法(IME)方式。
下面是中文地區(qū)的返回值:
常數(shù) 值 描述
vbIMENoOP 0 不安裝IME(缺省)
vbIMEOn 1 打開IME
ImeMode屬性返回或者設置被選定的對象的 IME (Input Method Editor,輸入方法編輯器)狀態(tài)。
可以先用ImeStatus函數(shù)來檢測當前的輸入狀態(tài),并用IMEMode來控制其輸入狀態(tài)。
如Text1.IMEMode=0(預定值)、=1(切換為中文輸入)、=2(切換為英文輸入)
對于簡體漢字和繁體漢字 IME,只能使用設置 0 到 2。設置 3 到 10 對于漢字系統(tǒng)是無效的。
VB6功能上對漢字處理的直接支持也僅限于此。對于漢字字符串的處理,VB6并沒有提供專門的函數(shù)和方法。
二、確定漢字字符串的長度
各個版本的VB對漢字字符的長度定義并不相同。在Windows 3.x中,VB3中認為每個漢字的長度為2字節(jié)。VB自從32位版本以後,不管中英文字,均以2 bytes來儲存,這與中文Win95的漢字內核有關。但是VB4以后,VB認為每個漢字的長度為1。這在處理包含漢字的字符串時帶來很多的不便。
由于Len、Left、Mid等字符串函數(shù)認為一個漢字和一個西文字符的長度都為1,因此處理漢字字符串時有一定的難度。實現(xiàn)上必須要能把漢字按照兩個字符(字節(jié))的形式讀出。因此在截取漢字字符串的子串時需特別注意。
由于漢字處理和漢字字模存儲的特殊性,在許多情況下我們希望漢字字符的長度為2,英文字符為1。由于VB5和VB6把一個漢字作為一個字符。因此處理漢字時首先必須能正確判斷漢字字符串的長度。
在VB3或C++里,漢字的 ASCII碼均大于零,而VB5和VB6中漢字的ASCII碼小于0。因此通過判斷一個未知字符的ASCII碼就可以判斷該字符是否漢字。
這里我們提供了兩種方法來判斷漢字字符串的長度。
1、方法1
VB6中提供了LenB函數(shù)用于字符串中的字節(jié)數(shù)據(jù)。如同在雙字節(jié)字符集(DBCS)語言中一樣,LenB返回的是用于代表字符串的字節(jié)數(shù),而不是返回字符串中字符的數(shù)量。如為用戶自定義類型,LenB返回在內存中的大小。
LenB(StrConv(Str1,vbFormUnicode))
對要處理的字符串Str1,必須先使用StrConv函數(shù)把ANSI格式的Byte數(shù)組轉換為字符串,否則直接使用LenB函數(shù)得到的結果比實際結果大。
2、方法2
這里自定義了一個子函數(shù)CLen來計算漢字字符串的實際長度。同時還能判斷字符串中漢字的實際個數(shù)。
Function CLen(HzStr$) as Integer
Static HzNum as Integer
L = len(HzStr$)
For n=1 to L
If Asc(mid$( HzStr$,n,1))﹤0 Then HzNum = HzNum + 1
Next n
Clen = L + HzNum
End Function
CLen函數(shù)中的靜態(tài)變量HzNum返回字符串中實際漢字的數(shù)目。
三、漢字字模讀寫和存儲的機理
計算機是以編碼的方式來處理和使用字符的。西文字符采用一個字節(jié)表示,即ASCII碼,一般只用七位來表示128個字符,而把最高位用作奇偶校驗(或者不用)。我國國標規(guī)定漢字用內碼表示,內碼為兩個字節(jié)。為了保證中西文兼容,也就是說漢字系統(tǒng)的內碼必須同時允許ASCII碼和漢字的使用,兩者之間不應發(fā)生沖突。目前規(guī)定每個字節(jié)只用七位,若兩個字節(jié)的最高位均為1,則該字符為漢字。
國標對漢字字庫的結構作了統(tǒng)一規(guī)定,即將字庫分成若干個區(qū),每個區(qū)有94個漢字,每個漢字在字庫中有確定的區(qū)和位,因此每個漢字各有一個區(qū)位碼,知道了區(qū)位碼也就相當于知道了漢字在字庫中的位置。由于漢字的內碼與區(qū)位碼有一定的關系,所以只要通過漢字的內碼就可得到該漢字的區(qū)位碼,也就得到了該漢字的字模。
查找一個漢字字模數(shù)據(jù)的算法為:
漢字內碼 -﹥ 區(qū)位碼 -(未完,下一頁)
|
|
|