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; }