UTF-8 の文字列をサイズで区切る。

/// <summary>
/// Utf8 エンコードされたバイト文字列を指定されたサイズ以下にの適切な区切り位置を取得します。
/// </summary>
/// <param name="buffer">Utf8 エンコードされたバイト文字列。</param>
/// <param name="size">区切りサイズ。</param>
/// <returns>取得された区切り位置。</returns>
static int GetUtf8SplitIndex( byte[] buffer, int size ) {
 if (buffer.Length < size) {
  return buffer.Length;
 }

 for (int i = size; i >= 0; i--) {
  if( IsFirstCode(buffer[i]) ) {
   return i;
  }
 }
 return 0;
}

/// <summary>
/// Utf8 の文字としての1バイト目であるかどうかを判別します。
/// </summary>
/// <param name="code">判定コード。</param>
/// <returns>1バイト目であれば true。それ以外は false。</returns>
static bool IsFirstCode( byte code ) {
 if ((code & 0x80) == 0) {
  return true;
 }
 return (code & 0xC0) == 0xC0;
}

使い方

/// <summary>
/// Utf-8 エンコードされた文字列を指定のサイズ以下に切り取ります。
/// </summary>
/// <param name="source">Utf-8 エンコードされた文字列。</param>
/// <param name="maxSize">切り取る最大サイズ。</param>
/// <returns>切り取られた文字列。</returns>
public static string SplitUtf8( string source, int maxSize ) {
  byte[] buffer = Encoding.UTF8.GetBytes( source );
  int size = GetUtf8SplitIndex( buffer, maxSize );
  return Encoding.UTF8.GetString( buffer, 0, size );
}