C#电子邮件主题解析

我正在构建一个用C#读取电子邮件的系统。 我在解析主题时遇到了问题,我认为这个问题与编码有关。

我正在阅读的主题如下: =?ISO-8859-1?Q?=E6=F8sd=E5f=F8sdf_sdfsdf?= ,发送的原始主题是æøsdåføsdf sdfsdf (那里有挪威字符)。

我有什么想法可以改变编码或正确解析它? 到目前为止,我已经尝试使用C#编码转换技术将主题编码为utf8,但没有任何运气。

这是我尝试过的解决方案之一:

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

编码称为引用可打印 。

查看此问题的答案。

改编自已接受的答案 :

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

当传递字符串=?ISO-8859-1?Q?=E6=F8sd=E5f=F8sdf_sdfsdf?=这将返回“æøsdåføsdf_sdfsdf”。

  public static string DecodeEncodedWordValue(string mimeString) { var regex = new Regex(@"=\?(?.*?)\?(?[qQbB])\?(?.*?)\?="); 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; }