● 文字列のバイト数を取得する ●

32ビット版のVBって文字列の文字数を取得する関数は用意されているんだけど、文字列のバイト数を取得する関数は用意されてない。

C言語では strlen という関数を使用すればよろしい。これでバイト数を得られる。16ビット版のVBでも、文字列のバイト数を取得する関数は用意されていた。LenBがそれにあたる。32ビット版にも LenB があるが、困ったことに異なる動きをする。 LenB("あいうABC") とすると12が返る。32ビット版から文字列はUnicodeで保持されるようになった。Unicodeというのは、1文字を2バイトで扱う文字規格である。だから、2×6という計算がなされ12が返る。いとかなし。一方、C言語では文字列はANSI規格(この言い方は間違っている鴨…)で保持される。これは、半角文字1バイト、全角文字は2バイトという約束である。

幸い、VBには StrConv という関数があり、文字列を Unicode から ANSI規格文字 に変換することが可能である。これを利用すれば文字列のバイト数を取得することが可能となる。やったぁ!!

'----------------------------------------------------------------
'  関数名 : GetStrLenB
'  機能   : 文字列のバイト数を取得する
'  引数   : (in) srcString … 調査対象文字列
'  戻り値 : 文字列のバイト数
'----------------------------------------------------------------
Private Function GetStrLenB(ByVal srcString As String) As Long

    GetStrLenB = LenB(StrConv(srcString, vbFromUnicode))

End Function

ここまで書いてきてこんな事を言うのは何だけど、実はもっと簡単な方法がある。それは lstrlen API 関数である!! 宣言は以下の通り

Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long

この関数に文字列を渡せばOK。引数のデータ型、ここでは String型 だけど、StrPtr による文字列のポインタを渡すことを想定して Long型 にするのも良い。APIの方が楽で、処理スピードもこちらの方が速いと思うんだけど、個人的には前者の方が好き。だって、こっちの方が VB っぽいことをやっている感じがするでしょ。


戻る