PerlのNet::Twitterをアップデートしたら、投稿した文字列が文字化けするようになってしまい、いろいろ調べてみたのですが、どうやらUTF8フラグの有無が原因のようでした。
参考にしたのはこちらのサイト。
で、
BOTのようにソースコード中につぶやく文字列を含んでいる場合は、ソースの初めにuse utf8;と書けばよく、フォームから入力された文字列をつぶやきたい場合は、CGI->Varsで取得した文字列にUTF8フラグを付ける必要があるようです。
なお、これはサイトもプログラムもUTF-8で書かれている場合の話なのであしからず。
サンプルコードとしてはこんな感じ。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI;
my %args = CGI->Vars;
my $twitter = new Net::Twitter(username => 'user', password => "pass");
# ソースコード内の文字列の場合
my $text = 'あいうえお';
$twitter->update($text);
# フォームから取得した文字列の場合
my $msg = $args{message};
utf8::decode($msg);
$twitter->update($msg);
結局のところ、UTF-8でPOSTされた文字列なのに、CGI->Varsに格納された文字列にはUTF8フラグが付いていなかったというのが悪かったということになるのかな。
■ 追記
utf8::decode()よりEncode::decode_utf8()を使った方がいいみたい。