WWW::Mechanizeで”HTTP::Message content must be bytes”とか表示されて大変だった。

未分類

WWW::Mechanizeで”HTTP::Message content must be bytes”とか表示されて大変だった。

表題の通り WWW::Mechanizeがうまく動かずに大変だった。実はこれ(HTTP::Message content […]

最終更新日:2010年3月19日

表題の通り 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

セール・特価情報

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

未分類カテゴリーの記事を全部見る