Hatena::ブログ(Diary)

くらげのChangeLog

2010-10-21

[]c#で、うまいこと全角を切ってくれるMidB関数

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;
}
トラックバック - http://d.hatena.ne.jp/ku__ra__ge/20101021/p3