3.30.2012

Get the length of multibyte string in VBScript

VBScript: 多バイト文字列の長さの取得

VBScript には、文字列の長さを調べる関数として「Len」「LenB」が用意されている。
しかし、「LenB」を行うと文字列はUnicodeとして扱われるため、半角文字も全角文字も2バイトとしてカウントされてしまう。

従ってそれらが混在している場合は正しい長さ(≒SJISのバイト数)を得ることはできない。

半角文字を1バイト、全角文字を2バイトとしてカウントするためには、このような関数を自前で用意する必要がある。

・Function LenMB()

Function LenMB(ByVal expression)
  If IsNull(expression) Then LenMB = Null: Exit Function
  Dim i, c: c = 0
  For i = 1 To Len(expression)
    If Asc(Mid(expression, i, 1)) And &Hff00 Then c = c + 1
  Next
  LenMB = i + c - 1
End Function

・テストコード

Function Check(s): WScript.Echo Len(s), LenB(s), LenMB(s): End Function

Check ""                      ' 0
Check "abcde"                 ' 5
Check "あいうえお"            ' 10 (=2*5)
Check "abcえお"               ' 7 (=3+2*2)
Check " "                     ' 1: 半角スペース
Check " "                    ' 2: 全角スペース
Check String(1000000, vbTab)  ' 1000000
Check String(1000000, "あ")   ' 2000000
Check Null                    ' null

・出力結果

0 0 0
5 10 5
5 10 10
5 10 7
1 2 1
1 2 2
1000000 2000000 1000000
1000000 2000000 2000000
null null null

 

2012/04/04 追記

Windows XP / Windows Server 2003 であれば、同様の処理は Microsoft.CmdLib オブジェクトを利用することで
より簡単に実現することができる。(ただし Null の扱いは少し変わる)

具体的には、CreateObject(“Microsoft.CmdLib”).LengthinBytes() を行なえばよい。

詳細はファイルの実体 %SystemRoot%\system32\cmdlib.wsc を参照。

0 件のコメント:

コメントを投稿