3

私は次のヘッダーを持っています:

From: =?iso-8859-1?Q?Marta_Falc=E3o?= <marta.falcao@example.com.br>

の前に簡単に分割できるので<

"=?iso-8859-1?Q?Marta_Falc=E3o?="

これを変換するために何を使用でき"Marta Falcão"ますか?

4

3 に答える 3

8

新しいメールジェムの使用:

Mail::Encodings.value_decode(str)また Mail::Encodings.unquote_and_convert_to(str, to_encoding)

于 2013-04-19T07:42:02.940 に答える
3

Roland Illigのコメントに感謝します。これにより、2つの選択肢が得られました。

  1. rfc2047-rubyをインストールして呼び出しますRfc2047.decode(header)
  2. TMailをインストールして電話をかけるTMail::Unquoter.unquote_and_convert_to(header, 'utf-8')か、それ以上に電話をかけますTMail::Address.parse(header).friendly。後者の方が<email address>一部を削除します。
于 2011-09-20T17:30:25.537 に答える
1

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/

于 2020-10-03T14:35:05.410 に答える