1000ポイントもらえる得しかないキャンペーン

Amazonチャージで5000円以上チャージすると1000円分のポイントがもらえるぞ!

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

この記事を書いた人

五藤隆介(goryugo)

愛知県在住1980年生まれ。

「仕事効率化」「ライフログ」「家族Hack」「デジタル情報共有」みたいなことを書いてます。

2014年に結婚して料理を覚えて、理系の料理という本を書きました。

年に1〜2回子連れで長旅をするようになり、新しく旅行・お出かけブログも作りました。

2018年4月からはPodcastも配信中。

この記事が気に入ったら
いいね!しよう

最新の情報をお届けします

Kindle Unlimitedで読めるオススメ本

これまでにKindle Unlimitedで読んだ本の中から、確実に楽しめるオススメ本をまとめました。