2010-04-05 11 views
1

Donc, étant donné cette chaîne d'entrée:Texte Décodage Problème

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

Et cette fonction:

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(); 

     } 

Le résultat est le même que les données extraites de la chaîne d'entrée. Qu'est-ce que je fais de mal que ce texte ne soit pas décodé correctement?

MISE À JOUR

j'ai donc ce code pour décoder citation imprimable:

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; 
       } 
      }); 
     } 

Et qui laisse juste les underscores. Est-ce que je les convertis manuellement en espaces (Replace ("_", "")), ou y a-t-il autre chose que je dois faire pour gérer cela?

+0

Pouvez-vous préciser le problème (votre cas!)? Que voulez-vous dire, "Le résultat est le même que les données extraites de la chaîne d'entrée"? Cela me semble que ça fonctionne très bien. –

+0

Les données sont renvoyées toujours codées. –

+0

Ce décodeur imprimable cité est fondamentalement faux. Il ne sera pas capable de gérer quoi que ce soit sauf l'ASCII 7 bits qui ne le coupera pas pour pratiquement n'importe quel usage. –

Répondre

3

On dirait que vous ne comprenez pas le format de la ligne d'entrée. Vérifiez ici: http://www.ietf.org/rfc/rfc2047.txt Format est: encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

donc vous devez

  1. Extranct charset (encodage en termes de .net). Non seulement UTF8 ou par défaut (UTF16)
  2. Extrait encoding: soit B pour base64 Q cité imprimable
  3. Effectuez ensuite le décodage à octets puis à chaîne
+0

s'il vous plaît voir la question mise à jour, merci. –

+0

La conversion en chaîne doit être la dernière opération. vous devez d'abord convertir votre texte: les symboles normaux sont lancés directement sur les octets, = XY sont transtypés en octets XY. – Andrey

2
  1. La fonction n'essaie même pas de décoder les éléments codés quoted-printable (les codes hexadécimaux et les traits de soulignement). Vous devez ajouter cela.
  2. Il est la manipulation du mal d'encodage (UTF-8 se décode avec pour une raison bizarre)
+0

Et, la chaîne de test est en fait au format quoted-printable. – driis