2010-08-13 27 views
4

我用邮件和名称和主题有时候会Q-编码的工作,像这样:有没有办法在Ruby中解码q编码的字符串?

=?UTF-8?Q?J=2E_Pablo_Fern=C3=A1ndez?= 

有没有办法将它们在Ruby中进行解码? TMail似乎应该照顾它,但它并没有这样做。

+0

http://ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI。 html#method-c-decode_www_form – equivalent8 2016-03-22 18:37:43

回答

6

我用这个来解析邮件主题:

你可以尝试以下方法:

str = "=?UTF-8?Q?J=2E_Pablo_Fern=C3=A1ndez?=" 
if m = /=\?([A-Za-z0-9\-]+)\?(B|Q)\?([!->@-~]+)\?=/i.match(str) 
     case m[2] 
     when "B" # Base64 encoded 
      decoded = Base64.decode64(m[3]) 
     when "Q" # Q encoded 
      decoded = m[3].unpack("M").first.gsub('_',' ') 
     else 
      p "Could not find keyword!!!" 
     end 
     Iconv.conv('utf-8',m[1],decoded) # to convert to utf-8 
end 
+0

+1不错,谢谢! – 2012-05-21 13:43:17

3

红宝石包括解码引用打印字符串的方法:

puts "Pablo_Fern=C3=A1ndez".unpack "M" 
# => Pablo_Fernández 

但是这似乎并没有在你的整个字符串(包括在开始=?UTF-8?Q?部分工作,也许你可以从工作了。 。那里,虽然

+0

我用'< br>'和'< div>'这样的东西。 – Dorian 2017-02-22 19:56:36

1

这是一个相当古老的问题,但TMail :: Unquoter(或其新的化身Mail :: Encodings)也可以完成这项工作。

TMail::Unquoter.unquote_and_convert_to(str, 'utf-8') 

Mail::Encodings.unquote_and_convert_to(str, 'utf-8') 
+0

我得到了'<= br>'和'<= div>'这样的东西 – Dorian 2017-02-22 19:58:06

0

解码上的线每线的基础上:

line.unpack("M") 

转换STDIN或编码的字符串的文件中提供输入到一个解码的输出:

if ARGV[0] 
    lines = File.read(ARGV[0]).lines 
else 
    lines = STDIN.each_line.to_a 
end 

puts lines.map { |c| c.unpack("M") }.join 
相关问题