WWW::Mechanizeを0.9.2でIconv::InvalidEncodingエラー
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
んー、どうするのがいいんだろ。