Set max title length – similar to excerpt length for outside of single.php

This depends 100% on how you’re getting the title. If you’re using a global object (i.e. $post->post_title then you’re not passing it through any filters and you’ll have to use some fancy post-processing to pare the title down.

However, if you’re inside a post loop, use either the_title() to echo the current post’s title or get_the_title() to return it programatically.

If you use one of those two functions, WordPress will automatically pass the post title through a filter before giving it back to you.

Then you can add the following to the top of your sidebar.php file:

function japanworm_shorten_title( $title ) {
    $newTitle = substr( $title, 0, 20 ); // Only take the first 20 characters
    
    return $newTitle . " …"; // Append the elipsis to the text (...) 
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );

Now, every time you reference the_title() or get_the_title() in your sidebar, they will return the automatically-shortened version instead of the full version.

Just remember to remove this filter at the end of your sidebar.php file or it will apply elsewhere in your theme as well:

remove_filter( 'the_title', 'japanworm_shorten_title' );

Update 10/3/2011

If you want a function you can use anywhere, I recommend making your own versions of get_the_title() and the_title() and using them in your code. For example:

function japanworm_get_the_title( $length = null, $id = 0 ) {
    $post = &get_post($id);

    $title = isset($post->post_title) ? $post->post_title : '';
    $id = isset($post->ID) ? $post->ID : (int) $id;

    if ( !is_admin() ) {
        if ( !empty($post->post_password) ) {
            $protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
            $title = sprintf($protected_title_format, $title);
        } else if ( isset($post->post_status) && 'private' == $post->post_status ) {
            $private_title_format = apply_filters('private_title_format', __('Private: %s'));
            $title = sprintf($private_title_format, $title);
        }
    }

    // Shorten the title
    if ( null != $length ) {
        $length = (int) $length;

        $title = substr( $title, 0, $length ); // Only take the first 20 characters
    
        $title .= " …";
    }

    return apply_filters( 'the_title', $title, $id );
}

function japanworm_the_title($before="", $after="", $echo = true, $length = null) {
    $title = get_the_title($length);

    if ( strlen($title) == 0 )
        return;

    $title = $before . $title . $after;

    if ( $echo )
        echo $title;
    else
        return $title;
}

These are copied from the original the_title() and get_the_title() functions, so they should work in the loop the same way. I haven’t tested this, though.