ruby - 在 ruby​​ 中从 iso-2022-jp 转换为 UTF

标签 ruby encoding imap

我从我们的邮件服务器获取一个 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 header 在发送前以 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 之类的东西进行调查,它了解邮件 header 的所有复杂性。

关于ruby - 在 ruby​​ 中从 iso-2022-jp 转换为 UTF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14262283/

相关文章:

c++ - boost::filesystem::path 与 boost::filesystem::wpath

IMAP 获取所选文件夹的 UID 列表

ruby - 数字范围到数字字符串数组?

ruby-on-rails - rails : Facebox link if condition is satisfied

encoding - 使用淡入淡出创建示例 mp3

免费的 php() : error: chunk is already free

c# - .NET 电子邮件处理建议

ruby - Sinatra:堆栈级别太深

ruby - Rails 3.1 Rspec 为模型创建测试用例验证字段

Python 编码问题