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