我正在从我们的邮件服务器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的东西,它了解邮件头的所有复杂性。