【问题标题】:How to properly decode string with quoted-printable encoding in Ruby如何在 Ruby 中使用带引号的可打印编码正确解码字符串
【发布时间】:2019-11-25 02:24:11
【问题描述】:

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

在 MBox 中,出现以下文本:

“Theresa Castel=E3o-Lawless 的划界”

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

“Theresa Castelão-Lawless 的划界”

我的陈述是基于它应该是什么样子的

1) 电子邮件的网络存档,其中文本被正确呈现为“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"

上面代码的结果是 “Theresa Castel?o-Lawless 的划界” 但如上所述,我想要 “Theresa Castelão-Lawless 的划界”

【问题讨论】:

  • 关于 2) 该页面是关于 ISO-8859-1 又名 ISO Latin 1。在 Ruby 中,字符串默认为 UTF-8。

标签: ruby quoted-printable


【解决方案1】:

当你有普通的旧红宝石来完成任务时,尽量避免奇怪的 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 在 cmets 中所建议的那样,可以将源编码作为第二个参数传递:

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

注意:在编码成目标UTF-8之前,需要force_encoding告诉引擎这是带有欧洲口音的单字节ISO。

【讨论】:

  • 您可以将源编码作为第二个参数传递:encode('utf-8', 'iso-8859-1')
  • @Stefan 是的,我认为这样会更明确一些。也许我错了,我会更新答案。
  • @AlekseiMatiushkin 我不确定如何在 SO 上处理这个问题,但是还有另一个非常相似的问题:stackoverflow.com/questions/3473952/… 严格来说,它不是重复的,因为这个问题的字符串只包含十六进制序列,没有 QP 分隔符、字符集和代码。 unpack 在这种情况下仍然是一个很好的解决方案,我围绕它编写了完整的示例代码。参考其他问答可能对这里的读者有所帮助。
猜你喜欢
  • 2017-04-19
  • 2017-10-25
  • 2012-05-14
  • 2012-10-12
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2020-03-16
相关资源
最近更新 更多