ヘッダー

VB.NET2002対応 VB.NET2003対応 VB2005対応

 

文字列をバイト単位で位置指定して切り抜く

以下の関数MidBを使うと、位置をバイト単位で指定して文字列を切り抜くことができる。この関数はMid関数と同じ使い方ができる。具体的な用法は使用例を参照。

VB.NET2002対応 VB.NET2003対応 VB2005対応

'■MidB
''' <summary>Mid関数のバイト版。文字数と位置をバイト数で指定して文字列を切り抜く。</summary>
''' <param name="str">対象の文字列</param>
''' <param name="Start">切り抜き開始位置。全角文字を分割するよう位置が指定された場合、戻り値の文字列の先頭は意味不明の半角文字となる。</param>
''' <param name="Length">切り抜く文字列のバイト数</param>
''' <returns>切り抜かれた文字列</returns>
''' <remarks>最後の1バイトが全角文字の半分になる場合、その1バイトは無視される。</remarks>
Public Function MidB(ByVal str As String, ByVal Start As Integer, Optional ByVal Length As Integer = 0) As String

    '▼空文字に対しては常に空文字を返す

    If str = "" Then
       
Return ""
   
End If

    '▼Lengthのチェック

    'Lengthが0か、Start以降のバイト数をオーバーする場合はStart以降の全バイトが指定されたものとみなす。

    Dim RestLength As Integer = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(str) - Start + 1

    If Length = 0 OrElse Length > RestLength Then
       
Length = RestLength
    End
If

    '▼切り抜き

    Dim SJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS")
    Dim B() As Byte =
CType(Array.CreateInstance(GetType(Byte), Length), Byte())

    Array.Copy(SJIS.GetBytes(str), Start - 1, B, 0, Length)

    Dim st1 As String = SJIS.GetString(B)

    '▼切り抜いた結果、最後の1バイトが全角文字の半分だった場合、その半分は切り捨てる。

    Dim ResultLength As Integer = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(st1) - Start + 1

    If Asc(Strings.Right(st1, 1)) = 0 Then
       
'VB.NET2002,2003の場合、最後の1バイトが全角の半分の時
       
Return st1.Substring(0, st1.Length - 1)
    ElseIf Length = ResultLength - 1
Then
       
'VB2005の場合で最後の1バイトが全角の半分の時
       
Return st1.Substring(0, st1.Length - 1)
   
Else
       
'その他の場合
       
Return st1
    End
If

End Function

使用例

Dim St As String = "VB中学校"

Dim Result1 As String = Mid(St, 2, 3)    'B中学
Dim Result2 As String = MidB(St, 2, 3)   'B中
Dim Result3 As String = Mid(St, 2, 2)    'B中
Dim Result4 As String = MidB(St, 2, 2)   'B

 


VB6対応 VB6ではStrConv関数とMidB関数を組み合わせて同じことが実現できます。VB6ではMidBはあらかじめ組み込まれている関数です。