2010-11-05 16 views
4

Je suis en train de construire un système de lecture des emails en C#. J'ai un problème d'analyse du sujet, un problème qui, je pense, est lié à l'encodage.C# analyse du sujet d'email

Le sujet que je suis en train de lire est le suivant: =?ISO-8859-1?Q?=E6=F8sd=E5f=F8sdf_sdfsdf?=, le sujet original envoyé est æøsdåføsdf sdfsdf (les caractères norvégiens sont là).

Des idées comment je peux changer l'encodage ou l'analyser correctement? Jusqu'à présent, j'ai essayé d'utiliser les techniques de conversion d'encodage C# pour encoder le sujet à utf8, mais sans aucune chance.

Voici une des solutions que j'essayées:

Encoding iso = Encoding.GetEncoding("iso-8859-1"); 
Encoding utf = Encoding.UTF8; 
string decodedSubject = 
    utf.GetString(Encoding.Convert(utf, iso, 
            iso.GetBytes(m.Subject.Split('?')[3]))); 
+0

Dans l'exemple ci-dessus, utf et iso sont échangés dans la méthode Convert. J'ai essayé la bonne manière sans aucune chance aussi;) – Kenneth

+0

Oh, je vais corriger ça :) – Kenneth

Répondre

6

L'encodage est appelé quoted printable.

Voir les réponses à la question this.

Adapté du answer accepté:

public string DecodeQuotedPrintable(string value) 
{ 
     Attachment attachment = Attachment.CreateAttachmentFromString("", value); 
     return attachment.Name; 
} 

Lorsque la chaîne passe =?ISO-8859-1?Q?=E6=F8sd=E5f=F8sdf_sdfsdf?= cela retourne "æøsdåføsdf_sdfsdf".

+0

Ah, génial mec. J'ai cherché une solution pour cela depuis longtemps maintenant :) – Kenneth

+0

Malheureusement, cela ne fonctionne pas avec la version actuelle de Mono sur ARM – TimothyP

+0

ne fonctionne pas avec "=? Windows-1256" – Alex

6
public static string DecodeEncodedWordValue(string mimeString) 
    { 
     var regex = new Regex(@"=\?(?<charset>.*?)\?(?<encoding>[qQbB])\?(?<value>.*?)\?="); 
     var encodedString = mimeString; 
     var decodedString = string.Empty; 

     while (encodedString.Length > 0) 
     { 
      var match = regex.Match(encodedString); 
      if (match.Success) 
      { 
       // If the match isn't at the start of the string, copy the initial few chars to the output 
       decodedString += encodedString.Substring(0, match.Index); 

       var charset = match.Groups["charset"].Value; 
       var encoding = match.Groups["encoding"].Value.ToUpper(); 
       var value = match.Groups["value"].Value; 

       if (encoding.Equals("B")) 
       { 
        // Encoded value is Base-64 
        var bytes = Convert.FromBase64String(value); 
        decodedString += Encoding.GetEncoding(charset).GetString(bytes); 
       } 
       else if (encoding.Equals("Q")) 
       { 
        // Encoded value is Quoted-Printable 
        // Parse looking for =XX where XX is hexadecimal 
        var regx = new Regex("(\\=([0-9A-F][0-9A-F]))", RegexOptions.IgnoreCase); 
        decodedString += regx.Replace(value, new MatchEvaluator(delegate(Match m) 
        { 
         var hex = m.Groups[2].Value; 
         var iHex = Convert.ToInt32(hex, 16); 

         // Return the string in the charset defined 
         var bytes = new byte[1]; 
         bytes[0] = Convert.ToByte(iHex); 
         return Encoding.GetEncoding(charset).GetString(bytes); 
        })); 
        decodedString = decodedString.Replace('_', ' '); 
       } 
       else 
       { 
        // Encoded value not known, return original string 
        // (Match should not be successful in this case, so this code may never get hit) 
        decodedString += encodedString; 
        break; 
       } 

       // Trim off up to and including the match, then we'll loop and try matching again. 
       encodedString = encodedString.Substring(match.Index + match.Length); 
      } 
      else 
      { 
       // No match, not encoded, return original string 
       decodedString += encodedString; 
       break; 
      } 
     } 
     return decodedString; 
    } 
+1

Btw, ayant rencontré plus de problèmes d'analyse de sujets et de contenus de courrier électronique; Par exemple une combinaison de Ascii et en.wikipedia.org/wiki/MIME#Encoded-Word, j'ai trouvé une autre solution capable d'analyser les combinaisons de mots codés et d'ascii en utilisant la conversion regex et byte by byte. Collage de la solution ci-dessus mise à jour des balises de référence (ne pas prendre en compte la solution car je l'ai trouvé sur un forum, ne pas se souvenir de l'url tho). Edit: essayé d'ajouter une balise de mot codé mais incapable de créer de nouvelles balises en raison de l'impossibilité de créer de balises. – Kenneth

+0

J'ai ajouté "\ s *" au début de regex. Parfois, nous avons plusieurs parties codées séparées par un espace. – Trurl

+0

@Kenneth Merci beaucoup, c'était exactement ce dont j'avais besoin. Ce n'est pas exactement comme utiliser un simple décodeur Quoted-Printable car ils ne considèrent pas le préfixe '=? ISO-8859-1? Q?' – silkfire