読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

せっかく MIME エンコードをパースしたので、本文をデコードしてみる

BASE64/Quoted-Printable のデコード方法

=~ と scan のパフォーマンスについて - @sugamasao.blog.title # => ”コードで世界を変えたい”ここで、文字コードエンコード方法、エンコード文字列が取得できるロジックを組んでいた。
せっかくそこまで書いたので、実際に我々が読める日本語にデコードする処理を書いて見る事にする。といっても、何ら難しい事は無い。unpackメソッド(http://www.ruby-lang.org/ja/man/html/String.html#unpack)を使えば良い。
以下は BASE64 エンコードをデコードする場合。

エンコード文字列.unpack("m")

Quoted-Pritable の場合は "M" となる

実例

たとえば、subject ヘッダを受け取り、パースする場合は以下の用にすると良いだろう。

def reg_test(str)
  if str =~ /.*?=\?(.+?)\?(.)\?(.+?)\?=/
    charset = $1
    encode_subject = $3
    subject = ""
    if $2 == "B" # BASE64
      subject = encode_subject.unpack("m").to_s # 戻り値は配列なので
    elsif $2 == "Q" # Quoted-Printable
      subject = encode_subject.unpack("M").to_s # 戻り値は配列なので
    end
end

reg_test("=?UTF-8?B?44GC44GC44GC44GC44GC44GC?=")

こんな感じになるのかな。
ちなみに、 NKF を使うと、そんなの一発で変換してくれるのだけど、文字コードは変更せずに BASE64 等だけ展開したい場合はこのような手法が役に立つかもしれません。