2014年12月29日月曜日

Ruby Mechanize の文字コードエンコーディング変換



最近はやり方が大部スマートになってるんですね。


encoding変換部分がフックできるようになっているのでそこでUTF-8に変換すれば良いだけです。


jpegだとかを間違って処理しないようにtextという文字をContent-Typeに含む物だけを変換しています。


コンテンツ本体は、body_ioを使ってファイルストリームのように扱います。



require 'mechanize'
require 'nkf'

agent = Mechanize.new

agent.content_encoding_hooks << Proc.new do |s, uri, response, body_io|
if %r|text/html| =~ response["Content-Type"]
body_io.rewind #念のため巻き戻し(多分不要)
tmp=NKF.nkf("-Ewm0",body_io.read);# readで読み込んでEUCからUTF-8にnkfで変換
tmp.force_encoding("utf-8");
body_io.rewind #巻き戻して、utf-8で書き直す
body_io.write(tmp);
response["Content-Type"]="text/html; charset=utf-8"
end
end





0 件のコメント:

コメントを投稿