文字列の一部をバイト単位で取り出す (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 として返すかを指定できます。
サンプルコード
以下にサンプルコードを示します。
J# 全般
import System.* /******************************************************************************** * * Microsoft.VisualBasic.Strings をカバーした静的クラスです。 * ********************************************************************************/ public class VBStrings { #region LeftB メソッド /********************************************************************************* * 文字列の左端から指定したバイト数分の文字列を返します。 * * @param stTarget 取り出す元になる文字列。 * @param iByteSize 取り出すバイト数。 * @return 左端から指定されたバイト数分の文字列。 *********************************************************************************/ public static final String LeftB(final String stTarget, final int iByteSize) { return MidB(stTarget, 1, iByteSize); } #endregion #region MidB メソッド (+1) /********************************************************************************* * 文字列の指定されたバイト位置以降のすべての文字列を返します。 * * @param stTarget 取り出す元になる文字列。 * @param iStart 取り出しを開始する位置。 * @return 指定されたバイト位置以降のすべての文字列。 *********************************************************************************/ public static final String MidB(final String stTarget, final int iStart) { final System.Text.Encoding hEncoding = System.Text.Encoding.GetEncoding("Shift_JIS"); final ubyte[] ubtBytes = hEncoding.GetBytes(stTarget); return hEncoding.GetString(ubtBytes, iStart - 1, ubtBytes.length - iStart + 1); } /********************************************************************************* * 文字列の指定されたバイト位置から、指定されたバイト数分の文字列を返します。 * * @param stTarget 取り出す元になる文字列。 * @param iStart 取り出しを開始する位置。 * @param iByteSize 取り出すバイト数。 * @return 指定されたバイト位置から指定されたバイト数分の文字列。 *********************************************************************************/ public static final String MidB(final String stTarget, final int iStart, final int iByteSize) { final System.Text.Encoding hEncoding = System.Text.Encoding.GetEncoding("Shift_JIS"); final ubyte[] ubtBytes = hEncoding.GetBytes(stTarget); return hEncoding.GetString(ubtBytes, iStart - 1, iByteSize); } #endregion #region RightB メソッド /********************************************************************************* * 文字列の右端から指定されたバイト数分の文字列を返します。 * * @param stTarget 取り出す元になる文字列。 * @param iByteSize 取り出すバイト数。 * @return 右端から指定されたバイト数分の文字列。 *********************************************************************************/ public static final String RightB(final String stTarget, final int iByteSize) { final System.Text.Encoding hEncoding = System.Text.Encoding.GetEncoding("Shift_JIS"); final ubyte[] ubtBytes = hEncoding.GetBytes(stTarget); return hEncoding.GetString(ubtBytes, ubtBytes.length - iByteSize, iByteSize); } #endregion }
使用例は以下のようになります。
J# 全般
// 必要な変数を宣言する String stTarget = "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
関連するリファレンス
準備中です。