2016-05-31 8 views
1

Я работаю на французской строки в .NET Декодирование почты тело, я получаю «Chasn = C3 = A9 Сюр Illet» Я хотел бы получить «Chasné сюр Illet» и Я не нахожу решения в течение 2 дней веб-поиска.Как конвертировать Цитируется-Print Строка

C# ou VB.NET Может ли кто-нибудь мне помочь?

спасибо

+0

Можете ли вы разместить бит вашего кода, где вы установили строку? –

+0

Здравствуйте, Моя строка приходит от сервера IMAP я прочитал сообщение и получить текстовое сообщение на теле с IMAP КОМАНДЫ: FETCH BODY [TEXT] и возвращает мне строку закодированную в Quoted_printable формате И я не нахожу любая идея сделать конвертер –

+0

@MarcCollin Смотрите код ниже с полным кодом. – ib11

ответ

0

Это кодировка UTF8.

Используя этот пост:

http://www.dpit.co.uk/decoding-quoted-printable-email-in-c/

Вот код (не забудьте принять ответ, если помог):

using System; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Console.WriteLine(DecodeQuotedPrintable("Chasn=C3=A9 sur illet")); 
      Console.ReadKey(); 
     } 

     static string DecodeQuotedPrintable(string input) 
     { 
      var occurences = new Regex(@"(=[0-9A-Z][0-9A-Z])+", RegexOptions.Multiline); 
      var matches = occurences.Matches(input); 
      foreach (Match m in matches) 
      { 
       byte[] bytes = new byte[m.Value.Length/3]; 
       for (int i = 0; i < bytes.Length; i++) 
       { 
        string hex = m.Value.Substring(i * 3 + 1, 2); 
        int iHex = Convert.ToInt32(hex, 16); 
        bytes[i] = Convert.ToByte(iHex); 
       } 
       input = input.Replace(m.Value, Encoding.UTF8.GetString(bytes)); 
      } 
      return input.Replace("=rn", ""); 
     } 
    } 
} 
-1
static string ConverFromHex(string source) 
    { 
     string target = string.Empty; 

     int startPos = source.IndexOf('=', 0); 
     int prevStartPos = 0; 
     while (startPos >= 0) 
     { 
      // concat with substring from source 
      target += source.Substring(prevStartPos, startPos - prevStartPos); 

      // next offset 
      startPos++; 

      // update prev pos 
      prevStartPos = startPos; 

      // get substring 
      string hexString = source.Substring(startPos, 2); 

      // get int equiv 
      int hexNum = 0; 
      if (int.TryParse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier, System.Globalization.CultureInfo.InvariantCulture, out hexNum)) 
      { 
       // add to target string 
       target += (char)hexNum; 

       // add hex length 
       prevStartPos += 2; 
      } 

      // next occurence 
      startPos = source.IndexOf('=', startPos); 
     } 

     // add rest of source 
     target += source.Substring(prevStartPos); 

     return target; 
    } 
+1

Этот код не обрабатывает строку OP правильно, результатом является «Chasnà © sur illet». Ваш код обрабатывает каждое шестнадцатеричное число как отдельный символ, но «= C3 = A9» должен представлять единственный символ «é». – Blackwood

0

От: https://stackoverflow.com/a/36803911/6403521 Мое решение :

[TestMethod] 
    public void TestMethod1() 
    { 

     Assert.AreEqual("La Bouichère", quotedprintable("La Bouich=C3=A8re", "utf-8")); 
     Assert.AreEqual("Chasné sur illet", quotedprintable("Chasn=C3=A9 sur illet", "utf-8")); 
     Assert.AreEqual("é è", quotedprintable("=C3=A9 =C3=A8", "utf-8")); 
    } 
    private string quotedprintable(string pStrIn, string encoding) 
    { 
     String strOut = pStrIn.Replace("=\r\n", ""); 
     // Find the first = 
     int position = strOut.IndexOf("="); 
     while (position != -1) 
     { 
      // String before the = 
      string leftpart = strOut.Substring(0, position); 
      // get the QuotedPrintable String in a ArrayList 
      System.Collections.ArrayList hex = new System.Collections.ArrayList(); 
      // The first Part 
      hex.Add(strOut.Substring(1 + position, 2)); 
      // Look for the next parts 
      while (position + 3 < strOut.Length && strOut.Substring(position + 3, 1) == "=") 
      { 
       position = position + 3; 
       hex.Add(strOut.Substring(1 + position, 2)); 
      } 
      // In the hex Array, we have two items 
      // Convert using the GetEncoding Function 
      byte[] bytes = new byte[hex.Count]; 
      for (int i = 0; i < hex.Count; i++) 
      { 
       bytes[i] = System.Convert.ToByte(new string(((string)hex[i]).ToCharArray()), 16); 
      } 
      string equivalent = System.Text.Encoding.GetEncoding(encoding).GetString(bytes); 
      // Part of the orignal String after the last QP Symbol 
      string rightpart = strOut.Substring(position + 3); 
      // Re build the String 
      strOut = leftpart + equivalent + rightpart; 
      // find the new QP Position 
      position = leftpart.Length + equivalent.Length; 
      if (rightpart.Length == 0) 
      { 
       position = -1; 
      } 
      else 
      { 
       position = strOut.IndexOf("=", position + 1); 
      } 
     } 
     return strOut; 
    } 
+0

бог, это слишком сложно. Вы попробовали мой ответ? – ib11

0

Или легче всего, просто использовать QuotedPrintableDecoder из моей библиотеки MimeKit:

static string DecodeQuotedPrintable (string input, string charset) 
{ 
    var decoder = new QuotedPrintableDecoder(); 
    var buffer = Encoding.ASCII.GetBytes (input); 
    var output = new byte[decoder.EstimateOutputLength (buffer.Length)]; 
    int used = decoder.Decode (buffer, 0, buffer.Length, output); 
    var encoding = Encoding.GetEncoding (charset); 
    return encoding.GetString (output, 0, used); 
} 

Обратите внимание, что другие ответы выше предполагают, что декодированного содержание будет ASCII или UTF-8, но это не обязательно дело. Вам нужно будет получить параметр charset из заголовка Content-Type части MIME, которую вы декодируете.

Конечно, если вы не знаете, как получить эту информацию, вы можете просто использовать мою огромную библиотеку MailKit, чтобы получить часть MIME из IMAP и заставить ее выполнять всю эту работу за вас.

0

У нас была проблема с этим методом - это ОЧЕНЬ медленно. Следующие улучшенные характеристики A LOT

public static string FromMailTransferEncoding(this string messageText, Encoding enc, string transferEncoding) 
{ 
    if (string.IsNullOrEmpty(transferEncoding)) 
     return messageText; 

    if ("quoted-printable".Equals(transferEncoding.ToLower())) 
    { 
     StringBuilder sb = new StringBuilder();    
     string delimitorRegEx = @"=[\r][\n]"; 
     string[] parts = Regex.Split(messageText, delimitorRegEx); 

     foreach (string part in parts) 
     { 
      string subPart = part; 
      Regex occurences = new Regex(@"(=[0-9A-Z][0-9A-Z])+", RegexOptions.Multiline); 
      MatchCollection matches = occurences.Matches(subPart); 

      foreach (Match m in matches) 
      { 
       byte[] bytes = new byte[m.Value.Length/3]; 
       for (int i = 0; i < bytes.Length; i++) 
       { 
        string hex = m.Value.Substring(i * 3 + 1, 2); 
        int iHex = Convert.ToInt32(hex, 16); 
        bytes[i] = Convert.ToByte(iHex); 
       } 

       subPart = occurences.Replace(subPart, enc.GetString(bytes), 1); 
      } 

      sb.Append(subPart); 
     } 
     return sb.ToString(); 
    }   
return messageText; 
}