C#で、VB6の頃のMidB関数っぽい動きをする関数。
全角文字の途中で開始したり終了したりすると、全角文字の半分であるゴミはカットされる。
/// <summary>
/// 指定位置から指定されたバイト数分の文字列を取得
/// </summary>
/// <param name="sData">文字列</param>
/// <param name="nStart">取得を開始する文字数(VBと同じ仕様)</param>
/// <param name="nLen">バイト数</param>
/// <returns>取得した文字列</returns>
/// <remarks></remarks>
public static string MidB(string sData, int nStart, int nLen)
{
Encoding oSJisEncoding = Encoding.GetEncoding("Shift_JIS");
byte[] nByteAry = oSJisEncoding.GetBytes(sData);
// 開始が最大文字数より後ろだった場合、空文字を戻す
if (nByteAry.Length < nStart)
{
return "";
}
// nLenが最大文字数を超えないように調整
if (nByteAry.Length < (nStart - 1) + nLen)
{
nLen = nByteAry.Length - (nStart - 1);
}
// 指定バイト数取りだし
string sMidStr = oSJisEncoding.GetString(nByteAry, nStart - 1, nLen);
// 最初の文字が全角の途中で切れていた場合はカット
string sLeft = oSJisEncoding.GetString(nByteAry, 0, nStart);
char sFirstMoji = sData[sLeft.Length - 1];
if (sMidStr != "" && sFirstMoji != sMidStr[0])
{
sMidStr = sMidStr.Substring(1);
}
// 最後の文字が全角の途中で切れていた場合はカット
sLeft = oSJisEncoding.GetString(nByteAry, 0, (nStart - 1) + nLen);
char sLastMoji = sData[sLeft.Length - 1];
if (sMidStr != "" && sLastMoji != sMidStr[sMidStr.Length - 1])
{
sMidStr = sMidStr.Substring(0, sMidStr.Length - 1);
}
return sMidStr;
}