読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

WWW::Mechanizeを0.9.2でIconv::InvalidEncodingエラー

Ruby

WWW::Mechanizeを0.9.2にupdateすると、以下のエラーになってクリック証券スクレイピングライブラリが動作しなくなった・・・。

Iconv::InvalidEncoding: invalid encoding ("Windows-31J", "UTF-8")
    /usr/lib/ruby/gems/1.8/gems/mechanize-0.9.2/lib/www/mechanize/util.rb:40:in `iconv'
    /usr/lib/ruby/gems/1.8/gems/mechanize-0.9.2/lib/www/mechanize/util.rb:40:in `from_native_charset'
    /usr/lib/ruby/gems/1.8/gems/mechanize-0.9.2/lib/www/mechanize/form.rb:151:in `from_native_charset'
    /usr/lib/ruby/gems/1.8/gems/mechanize-0.9.2/lib/www/mechanize/form.rb:143:in `proc_query'
    ...

原因

0.9.2より「Content-Type」レスポンスヘッダので指定されたcharsetでコンバートをかけるようになっていて、モバトレ君ではここに「text/html;charset=Windows-31J」が指定されている。だが、この「Windows-31J」がIconv#iconvでは使えないのが原因のようだ。

対処

いい解決方法を思いつかないので、とりあえず次のようなヘルパーを書いて対処。

module WWW
  class Mechanize
    class Util
        def self.from_native_charset(s, code)
          code = "SHIFT_JIS" if code == "Windows-31J"
          if Mechanize.html_parser == Nokogiri::HTML
            return unless s
            Iconv.iconv(code, "UTF-8", s).join("")
          else
            return s
          end
        end
    end
  end
end

んー、どうするのがいいんだろ。