将iso-2022-jp转换为ruby中的UTF



我在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这样的东西来研究,它知道所有关于邮件头的复杂性。

最新更新