玄関へお回り下さい。
指定バイト位置から指定バイト数分の文字列を取り出す関数 (1個)      (SNo.111)
使用コントロール Button1  
その他条件 WindowsXP(Vista) Visual Basic 2005(VB2008)
 
★ 指定バイト位置から指定バイト数分の文字列を取り出す関数
 
Private Function fMidB(ByVal myString As String, _
                       ByVal sByt As IntegerByVal nByt As IntegerAs String
'指定バイト位置から指定バイト数分の文字列を取り出す関数
   Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
   Dim tempByt() As Byte = sjis.GetBytes(myString)
   Dim sumByt As Integer = sjis.GetByteCount(myString)
   If sByt < 0 Or nByt <= 0 Or sByt > sumByt Then Return ""
   Dim strTemp As String = sjis.GetString(tempByt, 0, sByt)
   If sByt > 0 And strTemp.EndsWith("・"c) Then
      sByt += 1   '開始位置が漢字の中なら次(前)の文字から開始
   End If
   If sByt + nByt > sumByt Then     '文字長より多く取得しようとした場合
      nByt = sumByt - sByt          '文字列の最後までの分とする
   End If
   fMidB = sjis.GetString(tempByt, sByt, nByt).Trim("・"c)
   fMidB = fMidB.Trim(""c)
   Return fMidB
End Function
 

使用例(テスト結果)


Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
    ''下記の指定でエラーが発生せず取得できます。
    Debug.WriteLine("[" & fMidB("ABCあいう123", 0, 0) & "]")    '結果  []
    Debug.WriteLine("[" & fMidB("ABCあいう123", 0, 1) & "]")    '結果  [A]
    Debug.WriteLine("[" & fMidB("ABCあいう123", 2, 1) & "]")    '結果  [C]
    Debug.WriteLine("[" & fMidB("ABCあいう123", 3, 1) & "]")    '結果  []
    Debug.WriteLine("[" & fMidB("ABCあいう123", 3, 2) & "]")    '結果  [あ]
    Debug.WriteLine("[" & fMidB("ABCあいう123", 4, 1) & "]")    '結果  []
    Debug.WriteLine("[" & fMidB("ABCあいう123", 4, 2) & "]")    '結果  [い]
    Debug.WriteLine("[" & fMidB("ABCあいう123", 4, 7) & "]")    '結果  [いう123]
    Debug.WriteLine("[" & fMidB("ABCあいう123", 2, 20) & "]")   '結果  [Cあいう123]
    Debug.WriteLine("[" & fMidB("ABCあいう123", 20, 20) & "]")  '結果  []
End Sub

Private Function fMidB(ByVal myString As String, _
                     
ByVal sByt As IntegerByVal nByt As IntegerAs String
'(改良前)指定バイト位置から指定バイト数分の文字列を取り出す関数
   
Dim i, strByt, sumByt, tmpByt As Integer, strTemp As String
   
Dim sb As New System.Text.StringBuilder
   
Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
   
For i = 0 To myString.Length - 1
      strTemp = myString.Chars(i)
      strByt = sjis.GetByteCount(strTemp)
     
If tmpByt >= sByt Then
         sumByt += strByt
         
If sumByt <= nByt Then
            sb.Append(strTemp)
         
Else
           
Exit For
         
End If
     
Else
         tmpByt += strByt
     
End If
   
Next i
   
Return sb.ToString()
End Function
Net で検索すれば同様のサンプルやもっと簡単なサンプルがありますが、上記のように取得するとエラーが発生したり、漢字が分断されて Chr(0) の文字がついてきたりします、上記サンプルはそれらのエラー処理や漢字分断回避を行っております。
処理速度的にも問題はないかと思います。(文字を個別に調べながら取得する方法の5分の1、位の処理速度で実行できます。)





2005/10/17


VBレスキュー(花ちゃん)
VB.NET2003  VB2005