PerlでCGIモジュールを利用する時、Content-Typeヘッダにcharsetパラメータを加えるには、headerメソッドで-charset => 'UTF-8'などと指定するわけですが、どうもtext/*なもの以外では無視され、Content-Typeヘッダにcharsetパラメータを加えてくれないみたいです。

要は、

print header(
  -type    => 'application/xml',
  -charset => 'UTF-8',
);

だと、

Content-Type: application/xml

としか出力されないってことです。

blosxom$blog_charsetという文字コードを指定する設定を追加しようとして、ゴニョゴニョやっていた時に気づきました。CGIモジュールのソースでcharsetパラメータを付け加えるコードが、

$type .= "; charset=$charset" if $type ne '' and $type =~ m!^text/! and $type !~ /\bcharset\b/ and $charset ne '';

となってたので、text/*以外では無視というのはどうやら当たっていたみたいです。なので、

print header(
  -type => 'application/xml; charset=UTF-8',
);

こうやってやらないとダメぽ。またひとつ賢くなりました。

バッド・ノウハウ!