2010-04-05 60 views
1

所以給出該輸入字符串:文本解碼問題

=?ISO-8859-1?Q?TEST=2C_This_Is_A_Test_of_Some_Encoding=AE?= 

而這個功能:

private string DecodeSubject(string input) 
     { 
      StringBuilder sb = new StringBuilder(); 
      MatchCollection matches = Regex.Matches(inputText.Text, @"=\?(?<encoding>[\S]+)\?.\?(?<data>[\S]+[=]*)\?="); 
      foreach (Match m in matches) 
      { 
       string encoding = m.Groups["encoding"].Value; 
       string data = m.Groups["data"].Value; 

       Encoding enc = Encoding.GetEncoding(encoding.ToLower()); 
       if (enc == Encoding.UTF8) 
       { 
        byte[] d = Convert.FromBase64String(data); 
        sb.Append(Encoding.ASCII.GetString(d)); 
       } 
       else 
       {      
        byte[] bytes = Encoding.Default.GetBytes(data); 
        string decoded = enc.GetString(bytes); 
        sb.Append(decoded); 
       } 
      } 

      return sb.ToString(); 

     } 

結果是與從輸入字符串中提取的數據。我做錯了,這個文本沒有得到正確的解碼?

UPDATE

所以,我對於解碼報價打印的驗證碼

public string DecodeQuotedPrintable(string encoded) 
     { 
      byte[] buffer = new byte[1]; 
      return Regex.Replace(encoded, "=(\r\n?|\n)|=([A-F0-9]{2})", delegate(Match m) 
      { 
       if (byte.TryParse(m.Groups[2].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out buffer[0])) 
       { 
        return Encoding.ASCII.GetString(buffer); 
       } 
       else 
       { 
        return string.Empty; 
       } 
      }); 
     } 

而這只是離開下劃線。我是否手動將它們轉換爲空格(Replace(「_」,「」)),還是有其他需要處理的東西?

+0

你能否澄清的問題(你的情況!)?你是什​​麼意思,「結果與從輸入字符串中提取的數據相同」?這聽起來對我來說就像它工作得很好。 – 2010-04-05 15:19:54

+0

返回的數據仍然編碼。 – 2010-04-05 15:25:08

+0

引用可打印解碼器是根本錯誤的。它將無法處理除7位ASCII之外的任何內容,這些內容幾乎無法用於任何用途。 – 2010-04-05 16:29:12

回答

3

看起來你並不完全瞭解輸入行的格式。點擊此處查看:http://www.ietf.org/rfc/rfc2047.txt 格式爲:encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

所以你必須

  1. Extranct charset(編碼在.net中的條款)。不只是UTF8或默認(UTF-16)
  2. 提取編碼:或者B中的base64 Q代表引用可打印
  3. 然後進行解碼,以字節,然後串
+0

請看更新的問題,謝謝。 – 2010-04-05 15:57:56

+0

轉換爲字符串應該是上次操作。首先應該轉換文本:普通符號直接轉換爲字節,= XY轉換爲字節XY。 – Andrey 2010-04-05 18:00:23

2
  1. 該功能甚至沒有試圖解碼quoted-printable編碼的東西(十六進制代碼和下劃線)。你需要補充一點。
  2. 它處理的編碼錯誤(UTF-8獲取與解碼的理由很奇怪)
+0

而且,測試字符串實際上是引用打印的格式。 – driis 2010-04-05 15:26:38