WWW::MechanizeでShift-JISとかのフォームを送信する方法

WWW::Mechanizeはいろんなモジュールがベースになってて、コードを追うのが大変。LWP::UserAgentとかそれ以前の時代を知っていれば、どのモジュールが何を持ってるか分かっていいんだろうけど、いきなりWWW::Mechanizeから入ってしまうと厳しいっすね。まぁ、分からなけりゃその分コード読めばいい。

で、ふつうに$mech->submit_formで日本語を送ると、UTF-8でencodeした文字列になってしまって、SJISとかEUCのページを操作すると文字化けします。コード拾い読みして、たどり着いた解決方法がこれ。

$mech->get($target_url);
my $form = $mech->form_number(1);
$form->accept_charset('shiftjis');
my $req = $form->make_request;
$mech->request($req);

$mech->form_numberでHTML::Formのオブジェクトを取ってきて、accept_charsetを指定。あとは、$mech->submitがやってることをそのまま手動で実行。

これだとフォーム取得する度にaccept_charsetを指定する必要があって、あまりおいしくないんだけど、今のところここまで。もうちょっとうまいやり方はないもんかね。HTML::Form->parseしてる所を見付けてオプション投げるのがよさそうだけど、どこでやってんだろ。