日々精進

新しく学んだことを書き留めていきます

mechanizeで文字化け

※mechanizeのバージョンは1.0.0です。
○問題
mechanizeでhtmlをparseすると文字化けすることがあります。


○原因
・mechanizeは内部的にnokogiriを使っている
・(おそらく)nokogiriはKconvを使って文字コードを変換している
・(おそらく)webから取得したHTMLの文字コードKconv文字コード推定機能を使って判別している。この判別結果が間違っていることが原因。


○解決策
mechanizeからnokogiriにHTMLデータを渡す直前のところでhttpheaderのcharsetを元に文字コード変換を行う。
具体的にはresponse_body_parser.rbの23行目の部分に以下のコードを追加します。

if response['Content-Type'] =~ /utf-8/
response_body = Kconv.kconv(response_body, Kconv::UTF8, Kconv::UTF8)
elsif response['Content-Type'] =~ /euc/
response_body = Kconv.kconv(response_body, Kconv::UTF8, Kconv::EUC)
elsif response['Content-Type'] =~ /sjis/
response_body = Kconv.kconv(response_body, Kconv::UTF8, Kconv::SJIS)
end

これで解決しました。