2

我从我们的邮件服务器以 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,那么它会吐出垃圾。

4

1 回答 1

7

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

要解码的字节是

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

Ruby 可以解码引用的 printable,通过.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 之类的东西进行调查,它了解邮件标头的所有复杂性。

于 2013-01-10T17:43:27.640 回答