各個版本的VB對漢字字元的長度定義并不相同。在Windows 3.x中,VB3中認為每個漢字的長度為2位元組。VB自從32位版本以後,不管中英文字,均以2 bytes來儲存,這與中文Win95的漢字核心有關。但是VB4以後,VB認為每個漢字的長度為1。這在處理包含漢字的字元串時帶來很多的不便。
由于Len、Left、Mid等字元串函數認為一個漢字和一個西文字元的長度都為1,是以處理漢字字元串時有一定的難度。實作上必須要能把漢字按照兩個字元(位元組)的形式讀出。是以在截取漢字字元串的子串時需特别注意。
由于漢字處理和漢字字模存儲的特殊性,在許多情況下我們希望漢字字元的長度為2,英文字元為1。由于VB5和VB6把一個漢字作為一個字元。是以處理漢字時首先必須能正确判斷漢字字元串的長度。
在VB3或C++裡,漢字的 ASCII碼均大于零,而VB5和VB6中漢字的ASCII碼小于0。是以通過判斷一個未知字元的ASCII碼就可以判斷該字元是否漢字。
這裡我們提供了兩種方法來判斷漢字字元串的長度。
1、方法1
VB6中提供了LenB函數用于字元串中的位元組資料。如同在雙位元組字元集(DBCS)語言中一樣,LenB傳回的是用于代表字元串的位元組數,而不是傳回字元串中字元的數量。如為使用者自定義類型,LenB傳回在記憶體中的大小。
LenB(StrConv(Str1,vbFormUnicode))
對要處理的字元串Str1,必須先使用StrConv函數把ANSI格式的Byte數組轉換為字元串,否則直接使用LenB函數得到的結果比實際結果大。
2、方法2
這裡自定義了一個子函數CLen來計算漢字字元串的實際長度。同時還能判斷字元串中漢字的實際個數。
Function CharacterLen(s_str As String) As Integer
Dim i_num As Integer
Dim i_index As Integer
Dim i_len As Integer
i_len = Len(s_str)
For i_index = 1 To i_len
If Asc(Mid(s_str, i_index, 1)) < 0 Then
i_num = i_num + 1
End If
Next
CharacterLen = i_len + i_num
End Function
CharacterLen函數中的靜态變量HzNum傳回字元串中實際漢字的數目。