Spreadsheet::WriteExcelで文字化け

Perl質問箱より。解決に向かっているようですが、回答しながら色々と調べることが出来たので、自分メモをかねて。まだ日本語で解説されているドキュメントも見つからないですし。
まず、この現象はSpreadsheet::WriteExcelの比較的新しいバージョン(少なくとも2.04)で発生し、おそらく今後のバージョンでは発生し続けることになると思われます。この現象は、Spreadsheet::WriteExcelの吐き出すExcelフォーマットがバージョンによって異なることに起因します。すなわち、過去はExcel5.0のフォーマットだったものが、現在はExcel97のフォーマットになりました。Excel自身はどちらのフォーマットも(少なくとも今は)解釈しますが、Spreadsheet::WriteExcelは片方しか吐き出ししません。
さてこの新しいExcel97フォーマットですが、基本的に2種類の文字コードを扱います(他の文字コードも扱うかもしれませんが、Spreadsheet::WriteExcelは扱いません)。その文字コードは、ASCIIとUnicodeです。このうち、日本語を扱うことが出来るのは当然Unicodeだけです。で、Excelがある文字を意味したバイト列を見た時には、それがASCIIなのかUnicodeなのかを解釈しなくちゃいけません。つまり、何らかのフラグが必要です。そのフラグを立てるために、writeメソッドではなくて、write_unicodeメソッドを使う必要があります。
具体的に、どうするかをスクリプトを用いて解説します。一応Jcode使ってみます。

昔のバージョン:

use Spreadsheet::WriteExcel;
use Jcode;
use strict;

my $font = 'Gulim';
my $message = Jcode->new('表示されるかな', 'euc');

my $workbook = Spreadsheet::WriteExcel->new("perl.xls");
my $worksheet = $workbook->addworksheet();

my $format = $workbook->addformat();
$format->set_font($font);

my $col = my $row = 0;

$worksheet->write($row, $col, $message->sjis, $format);#文字コードはShift-JIS、writeメソッドを用いる
$worksheet->write(1, $col, $message->sjis);

新しいバージョン:

use Spreadsheet::WriteExcel;
use Jcode;
use strict;

my $font = 'Gulim';
my $message = Jcode->new('表示されるかな', 'euc');

my $workbook = Spreadsheet::WriteExcel->new("perl.xls");
my $worksheet = $workbook->addworksheet();

my $format = $workbook->addformat();
$format->set_font($font);

my $col = my $row = 0;

$worksheet->write_unicode($row, $col, $message->ucs2, $format);#文字コードはUCS2、write_unicodeメソッドを用いる
$worksheet->write_unicode(1, $col, $message->ucs2);

使い方はあまり変わりませんが、日本語文字コードを扱う人間にとってこの違いは結構大きいと思います。
なお、現在のSpreadsheet::WriteExcelにおいては、日本語名のフォント(例えばMS Pゴシック)等は用いることが出来ません。と言うのは、本来であればwrite_unicodeメソッドのように、
$format->set_font_unicode($font->ucs2);
というようなメソッドを用意しなくてはならない(もしくはメソッドのオプションで指定しなくてはならない)のにもかかわらず、現在そのメソッドは提供されていません。そのうちバージョンがあがれば使えるようになるかもしれません。従って、日本語名のフォントをExcelで使いたい場合は、バージョンアップを待つか、過去のバージョンのSpreadsheet::WriteExcelを使う必要があります。
とりあえず以上。