'■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