用過VB5.0或者更早版本的讀者應該知道VB有一個測試字符串長度的函數: Len。但當你升級到VB6時,會發現這里的Len並沒有以前那么好用了——它變成了測試字符個數而不是字符串長度。就是說,當你用以前版本的VB執行Len("字符abc")時,返回值是7,因為中文字符每個有2個字節,所以總共有7個字節;而在VB6中執行,返回值是5。
VB6不再有一個直接計算出字符串總字節數的函數了,因為VB6內部已經把字符串轉換成了Unicode——一種比ANSI更新的字符編碼方式。
Unicode把每一個字,無論是中文還是其他文字都當成兩個字節,如果是英文,則這兩個字節中第二個字節保留着不使用,如果是雙字節字符(如中文,雙字節日文以及韓文),而由這兩個字節的組合表示一個字符。所以Len可以方便地知道一共有多少個雙字節字符,多少個單字節字符,也就出現了上面所說的情況。
不過既然VB內部把ANSI字符轉換成Unicode,那么它一定有對應方法轉換回來。所以這里提供一個比較方便的方法來得到總字節數: LenB(StrConv("字符abc", vbFromUnicode))。
這里用到了一個LenB() 函數,你可以自己試試它,比如 LenB("字符")、LenB("abc")、LenB("字符abc"),會發現返回值分別是4、6和10。
為什么是4、6和10呢?
我說過VB內部把ANSI字符轉換為Unicode,每個Unicode字符用2個字節來表示,所以,LenB() 的作用是返回字符串的實際字節數。但是,這個實際字節數已經不是我所輸入的字符串的,而是被VB轉換過的(我們無法讓VB函數在轉換之前先算好長度),所以我們需要先把字符串轉換回來,使用的是 StrConv() 函數。
對於這個函數我不想太過詳細解釋它(一般應用中比較少用),你可以參考MSDN,我只提一提它的第二個參數:vbFromUnicode。
StrConv()函數的第二個函數指定轉換的類型,vbFromUnicode 指定把字符串從Unicode轉換回來,如果是vbUnicode,則把字符串轉換為Unicode。注意,雖然你的程序中寫的是ANSI的字符而不是Unicode字符,但當這個函數執行時,它得到的卻是已經被轉換成為Unicode的字符串了。
現在問題可以算解決了,但我們還需要另一個解決方法,因為這種方法太費時。想想看,每一次算長度都要進行 Unicode->ANSI 的轉換,這將會花費太多時間。對少量字符還可以,對長字符串,時間就變得更長了。
所以我們再講一個API:lstrlen。
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
以上是lstrlen的聲明。lstrlen的作用只有一個:
得到以chr(0)為結尾的字符串的字節數。所以執行 lstrlen("字符abc"+chr(0)) 將返回7。我們不需要知道它內部是如何工作的,但它總是返回該字符串是ANSI時的長度,並且速度很快
