指定された文字列を指定したbyte数単位で分割し、結果を配列として返す関数です。
byte数は、SJISとして解釈した場合での計算となります。
本関数は、phpで言うところのマルチバイト対応版str_split()関数のようなものです。
//********************************************************************* /// <summary>文字列を指定した文字数単位で分割する(全角文字考慮) /// </summary> /// <param name="inStr"> 分割前文字列</param> /// <param name="length"> 1行の長さ</param> /// <returns> 分割後文字列の配列</returns> //********************************************************************* private string[] mbStrSplit( string inStr, int length ) { List<string> outArray = new List<string>(); // 分割結果の保存領域 string outStr = ""; // 現在処理中の分割後文字列 Encoding enc = Encoding.GetEncoding("Shift_JIS"); // パラメータチェック if ( inStr == null || length < 1 ) { return outArray.ToArray(); } //-------------------------------------- // 全ての文字を処理するまで繰り返し //-------------------------------------- for ( int offset = 0; offset < inStr.Length ; offset++ ) { //---------------------------------------------------------- // 今回処理する文字と、その文字を含めた分割後文字列長を取得 //---------------------------------------------------------- string curStr = inStr[offset].ToString(); int curTotalLength = enc.GetByteCount( outStr ) + enc.GetByteCount( curStr ); //------------------------------------- // この文字が、分割点になるかチェック //------------------------------------- if ( curTotalLength == length ) { // 処理中の文字を含めると、ちょうどピッタリ outArray.Add( outStr + curStr ); outStr = ""; } else if ( curTotalLength > length ) { // 処理中の文字を含めると、あふれる outArray.Add( outStr ); outStr = curStr; } else { // 処理中の文字を含めてもまだ余裕あり outStr += curStr; } } // 最後の行の文を追加する if ( !outStr.Equals( "" ) ) { outArray.Add( outStr ); } // 分割後データを配列に変換して返す return outArray.ToArray(); } |
ちなみに全角文字チェックは行っていますが、禁則処理には対応していません。
この為、行頭に「。」、「々」、「っ」などが出てくる可能性が有ります。
関連記事
コメントを残す