指定バイト位置から指定バイト数分の文字列を取り出す関数 (1個) (SNo.111) | |
使用コントロール | Button1 |
その他条件 | WindowsXP(Vista) Visual Basic 2005(VB2008) |
★ 指定バイト位置から指定バイト数分の文字列を取り出す関数
Private Function fMidB(ByVal myString As String, _ ByVal sByt As Integer, ByVal nByt As Integer) As 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 Integer, ByVal nByt As Integer) As 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、位の処理速度で実行できます。) |