標籤:io 使用 ar sp 問題 on cti 工作 時間
用過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時的長度,並且速度很快
vb6擷取字串長度