在ruby中从iso-2022-jp转换为UTF

cal*_*son 2 ruby encoding imap

我从iso-2022-jp中的邮件服务器获取一个字符串,但我将其转换为UTF时遇到问题.

sub #=> "=?iso-2022-jp?Q?Auto-Asia-JP-1=1B$B$N$4M=3DLsFbMF$N3NG'=1B(B?="
sub.encoding  #=> #<Encoding:US-ASCII>
Run Code Online (Sandbox Code Playgroud)

我尝试过使用Encoding :: Converter.

ec = Encoding::Converter.new("ISO-2022-JP", "UTF-8")
ec.convert(sub)    #=> "=?iso-2022-jp?Q?Auto-Asia-JP-1=1B$B$N$4M=3DLsFbMF$N3NG'=1B(B?="
Run Code Online (Sandbox Code Playgroud)

我也尝试过掉字符串的第一部分,字符串的最后部分,以及它们之间的每个组合.Ruby认为sub是ASCII,但如果我试图通过使用force_encoding告诉它它是ISO-2022-JP那么它会吐出垃圾.

Fre*_*ung 6

字符串是ascii:非ascii标头在发送之前以ascii编码,以便它们可以安全地通过只能理解ascii的邮件服务器.Q表示iso-2022字节使用quoted printable进行编码.

要解码的字节是

Auto-Asia-JP-1=1B$B$N$4M=3DLsFbMF$N3NG'=1B(B
Run Code Online (Sandbox Code Playgroud)

红宝石可以解码引述通过打印.unpack("M").first.gsub('_',' ')其收益率

Auto-Asia-JP-1\e$B$N$4M=LsFbMF$N3NG'\e(B
Run Code Online (Sandbox Code Playgroud)

如果你那么做force_encoding('ISO-2022-JP').encode('UTF-8')那个字符串我然后得到

Auto-Asia-JP-1?????????
Run Code Online (Sandbox Code Playgroud)

虽然我不会说日语,但这可能是胡说八道.

您可能希望使用类似邮件gem的东西进行调查,它知道邮件标题的复杂性.