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

时间:2013-01-10 16:13:44

标签: 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>

我尝试过使用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?="

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

1 个答案:

答案 0 :(得分:6)

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

要解码的字节是

Auto-Asia-JP-1=1B$B$N$4M=3DLsFbMF$N3NG'=1B(B

Ruby可以通过.unpack("M").first.gsub('_',' ')对引用的可打印进行解码,产生

Auto-Asia-JP-1\e$B$N$4M=LsFbMF$N3NG'\e(B

如果您对该字符串执行force_encoding('ISO-2022-JP').encode('UTF-8'),我就会

Auto-Asia-JP-1のご予約内容の確認

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

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