我正在从我们的邮件服务器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_编码告诉它它是iso-2022-jp,那么它会吐出垃圾。

最佳答案

字符串是ascii:非ascii头在发送之前用ascii编码,这样它们就可以安全地通过只理解ascii的邮件服务器。q表示iso-2022字节使用带引号的可打印文件进行编码。
要解码的字节是

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のご予約内容の確認

虽然我不会说日语,所以这很可能是胡说八道。
您可能想研究一下使用类似于mail gem的东西,它了解邮件头的所有复杂性。

10-05 23:42