如何在 Ruby 中使用引用打印编码正确解码字符串

How to properly decode string with quoted-printable encoding in Ruby

我正在尝试解码我​​认为是出现在 MBox 电子邮件存档中的一些引用可打印的编码文本。我将举一个我遇到问题的文本示例。

在 MBox 中,出现以下文本:

"Demarcation by Theresa Castel=E3o-Lawless"

正确解码,我认为这应该显示为:

"Demarcation by Theresa Castelão-Lawless"

我的陈述基于

1) 电子邮件的网络存档,其中文本正确呈现为 "Demarcation by Theresa Castelão-Lawless"

和 2) 此页面显示“=E3”对应于引用打印的“ã”https://www.ic.unicamp.br/~stolfi/EXPORT/www/ISO-8859-1-Encoding.html

我试过下面的代码,但它给出了错误的输出。


string = "Demarcation by Theresa Castel=E3o-Lawless"

decoded_string = Mail::Encodings::QuotedPrintable.decode(string)

puts decoded_string + "\n"

以上代码的结果是 "Demarcation by Theresa Castel?o-Lawless" 但如上所述,我想要 "Demarcation by Theresa Castelão-Lawless"

当你有普通的好东西 ruby 来完成任务时,尽量避免奇怪的 Rails 东西。 String#unpack 是你的朋友。

"Demarcation by Theresa Castel=E3o-Lawless".
  unpack("M").first. # unpack as quoted printable
  force_encoding(Encoding::ISO_8859_1).
  encode(Encoding::UTF_8)
#⇒ "Demarcation by Theresa Castelão-Lawless"

或者,正如@Stefan 在评论中所建议的,可以将源编码作为第二个参数传递:

"Demarcation by Theresa Castel=E3o-Lawless".
  unpack("M").first. # unpack as quoted printable
  encode('utf-8', 'iso-8859-1')

注意: force_encoding 需要在编码到目标 UTF-8 之前告诉引擎这是 single-byte 带有欧洲口音的 ISO。 =16=]