2010-08-13 28 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 
相關問題