WWW::Mechanizeで"HTTP::Message content must be bytes"とか表示されて大変だった。
表題の通り WWW::Mechanizeがうまく動かずに大変だった。実はこれ(HTTP::Message content must be bytes)以外にもいろんなエラーが出てたりもしたが、その辺は省略。
どうにか原因らしきものと対策がわかったのでメモ。
原因は文字コード。UTF-8で書かれた一部のhtmlでこうなるみたい。
で、このUTF8テキストをHTTP::Request::Comoonがうまくutf8ヘッダー?を処理できていなかったっぽい。
もうどうしようもなかったので、手動でCommon.pmを書き換えた。
(それ以外にも、プログラム内に use utf8;も追記した)
HTTP::Request::Common v5.824 108行目あたり
変更前
while (($k,$v) = splice(@data, 0, 2)) { if (!ref($v)) { $k =~ s/([\\\"])/\\$1/g; # escape quotes and backslashes push(@parts, qq(Content-Disposition: form-data; name="$k"$CRLF$CRLF$v));
変更後
if (!ref($v)) { $k =~ s/([\\\"])/\\$1/g; # escape quotes and backslashes if (utf8::is_utf8($v)){ utf8::encode($v); } push(@parts, qq(Content-Disposition: form-data; name="$k"$CRLF$CRLF$v)); }
なんとかエラーは出なくなった。
それにしても文字コード問題は日本人の宿命なのだろうか?
英語圏の人はそれだけ分だいぶ楽だよなぁ。
参考
http://code.google.com/p/www-mechanize/issues/detail?id=70