私は次のヘッダーを持っています:
From: =?iso-8859-1?Q?Marta_Falc=E3o?= <marta.falcao@example.com.br>
の前に簡単に分割できるので<
、
"=?iso-8859-1?Q?Marta_Falc=E3o?="
これを変換するために何を使用でき"Marta Falcão"
ますか?
新しいメールジェムの使用:
Mail::Encodings.value_decode(str)
また
Mail::Encodings.unquote_and_convert_to(str, to_encoding)
Roland Illigのコメントに感謝します。これにより、2つの選択肢が得られました。
Rfc2047.decode(header)
TMail::Unquoter.unquote_and_convert_to(header, 'utf-8')
か、それ以上に電話をかけますTMail::Address.parse(header).friendly
。後者の方が<email address>
一部を削除します。Rubyを使用してRFC2047を実装するのは難しくありません。
module Rfc2047
TOKEN = /[\041\043-\047\052\053\055\060-\071\101-\132\134\136\137\141-\176]+/.freeze
ENCODED_TEXT = /[\041-\076\100-\176]+/.freeze
ENCODED_WORD = /=\?(?<charset>#{TOKEN})\?(?<encoding>[QB])\?(?<encoded_text>#{ENCODED_TEXT})\?=/i.freeze
class << self
def encode(input)
"=?#{input.encoding}?B?#{[input].pack('m0')}?="
end
def decode(input)
match_data = ENCODED_WORD.match(input)
raise ArgumentError if match_data.nil?
charset, encoding, encoded_text = match_data.captures
decoded =
case encoding
when 'Q', 'q' then encoded_text.unpack1('M')
when 'B', 'b' then encoded_text.unpack1('m')
end
decoded.force_encoding(charset)
end
end
end
Rfc2047.decode '=?iso-8859-1?Q?Marta_Falc=E3o?=' # => Marta_Falcão
アップデート
mikel / mailには現在、文字列を正しくデコードできない可能性のあるエンコーディングの問題があります。
それが本当に気になる場合は、試してみてくださいnew_rfc_2047
:
$ gem install new_rfc_2047
$ ruby -rrfc_2047 -e 'puts Rfc2047.decode "From: =?iso-8859-1?Q?Marta_Falc=E3o?= <marta.falcao@example.com.br>"'
From: Marta Falcão <marta.falcao@example.com.br>
mikel / mailのソースコードは少し複雑すぎて変更できないので、自分で宝石を作りました。
宝石のソースはここにあります:https ://github.com/tonytonyjan/rfc_2047/