如何在 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=]
我正在尝试解码我认为是出现在 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=]