我在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,那么它就会吐出垃圾。
字符串为ascii:非ascii标头在发送之前用ascii编码,以便它们可以安全地通过只理解ascii的邮件服务器。Q表示iso-2022字节使用带引号的printable进行编码。
要解码的字节是
Auto-Asia-JP-1=1B$B$N$4M=3DLsFbMF$N3NG'=1B(B
Ruby可以通过.unpack("M").first.gsub('_',' ')
解码引用的printable,生成
Auto-Asia-JP-1e$B$N$4M=LsFbMF$N3NG'e(B
如果你对那个字符串执行force_encoding('ISO-2022-JP').encode('UTF-8')
,我就会得到
Auto-Asia-JP-1のご予約内容の確認
虽然我不会说日语,所以这很可能是胡说八道。
您可能想要使用像mail gem这样的东西来研究,它知道所有关于邮件头的复杂性。