文字列の一部をバイト単位で取り出す (LeftB, MidB, RightB)
スポンサーリンク
旧システムなどの外部連携のために、テーブルに格納するデータにバイト制限をかける場合があります。良くあるのが、半角を 1 バイト、全角を 2 バイトでカウントして規定の長さに収めるなどです。
System.String クラスの Substring メソッドでは、文字単位でしか指定ができません。というよりは、半角または全角という概念は消滅しつつあります。(Unicode や UTF-8 の文字コードを参照)
VB6 では LeftB, MidB, RightB などの関数で、バイト単位での文字の取り出しができました。StrConv 関数などの合わせ技で文字コードを変えてから、使用していました。
半角は 1 バイト、全角は 2 バイトという考えは、Shift_JIS という文字コードの考えです。つまりは、Shift_JIS にエンコードしてやれば、半角 1 バイト、全角 2 バイトでのバイト数が取得できます。
System.Text.Encoding クラスから GetEncoding メソッドを実行し、ここで Shift_JIS の Encoding のインスタンスを取得します。そのインスタンスから、GetBytes メソッドを使用することで、Shift_JIS での文字コードを格納した System.Byte 型の配列ができます。この配列に対して、先の Encoding のインスタンスから GetString メソッド を使用し、どの位置から何バイトを System.String として返すかを指定できます。
サンプルコード
以下にサンプルコードを示します。
VB.NET 全般
Option Strict On ''' ----------------------------------------------------------------------------- ''' <summary> ''' Microsoft.VisualBasic.Strings をカバーした静的クラスです。 ''' <summary> ''' ----------------------------------------------------------------------------- Public Class VBStrings #Region " LeftB メソッド " ''' ----------------------------------------------------------------------------------------- ''' <summary> ''' 文字列の左端から指定したバイト数分の文字列を返します。</summary> ''' <param name="stTarget"> ''' 取り出す元になる文字列。<param> ''' <param name="iByteSize"> ''' 取り出すバイト数。</param> ''' <returns> ''' 左端から指定されたバイト数分の文字列。</returns> ''' ----------------------------------------------------------------------------------------- Public Shared Function LeftB(ByVal stTarget As String, ByVal iByteSize As Integer) As String Return MidB(stTarget, 1, iByteSize) End Function #End Region #Region " MidB メソッド (+1) " ''' ----------------------------------------------------------------------------------------- ''' <summary> ''' 文字列の指定されたバイト位置以降のすべての文字列を返します。</summary> ''' <param name="stTarget"> ''' 取り出す元になる文字列。</param> ''' <param name="iStart"> ''' 取り出しを開始する位置。</param> ''' <returns> ''' 指定されたバイト位置以降のすべての文字列。</returns> ''' ----------------------------------------------------------------------------------------- Public Shared Function MidB(ByVal stTarget As String, ByVal iStart As Integer) As String Dim hEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") Dim btBytes As Byte() = hEncoding.GetBytes(stTarget) Return hEncoding.GetString(btBytes, iStart - 1, btBytes.Length - iStart + 1) End Function ''' ----------------------------------------------------------------------------------------- ''' <summary> ''' 文字列の指定されたバイト位置から、指定されたバイト数分の文字列を返します。</summary> ''' <param name="stTarget"> ''' 取り出す元になる文字列。</param> ''' <param name="iStart"> ''' 取り出しを開始する位置。</param> ''' <param name="iByteSize"> ''' 取り出すバイト数。</param> ''' <returns> ''' 指定されたバイト位置から指定されたバイト数分の文字列。</returns> ''' ----------------------------------------------------------------------------------------- Public Shared Function MidB _ (ByVal stTarget As String, ByVal iStart As Integer, ByVal iByteSize As Integer) As String Dim hEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") Dim btBytes As Byte() = hEncoding.GetBytes(stTarget) Return hEncoding.GetString(btBytes, iStart - 1, iByteSize) End Function #End Region #Region " RightB メソッド " ''' ----------------------------------------------------------------------------------------- ''' <summary> ''' 文字列の右端から指定されたバイト数分の文字列を返します。</summary> ''' <param name="stTarget"> ''' 取り出す元になる文字列。</param> ''' <param name="iByteSize"> ''' 取り出すバイト数。</param> ''' <returns> ''' 右端から指定されたバイト数分の文字列。</returns> ''' ----------------------------------------------------------------------------------------- Public Shared Function RightB(ByVal stTarget As String, ByVal iByteSize As Integer) As String Dim hEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") Dim btBytes As Byte() = hEncoding.GetBytes(stTarget) Return hEncoding.GetString(btBytes, btBytes.Length - iByteSize, iByteSize) End Function #End Region End Class
使用例は以下のようになります。
VB.NET 全般
' 必要な変数を宣言する Dim stTarget As String = "ABCDEF" ' 左端から 6 バイトの文字列を取得する MessageBox.Show(VBStrings.LeftB(stTarget, 6)) 'ABCD ' 左端から 4 バイト以降のすべての文字列を取得する MessageBox.Show(VBStrings.MidB(stTarget, 4)) 'CDEF ' 左端から 4 バイト目から 5 バイトの文字列を取得する MessageBox.Show(VBStrings.MidB(stTarget, 4, 5)) 'CDE ' 右端から 3 バイトの文字列を取得する MessageBox.Show(VBStrings.RightB(stTarget, 3)) 'EF
関連するリファレンス
準備中です。