2012-05-05 2 views
4

У меня есть следующая строка:Decode цитируемых печатей правильно

=?utf-8?Q?=5Bproconact_=2D_Verbesserung_=23=32=37=39=5D_=28Neu=29_Stellvertretungen_Benutzerrecht_=2D_andere_k=C3=B6nnen_f=C3=BCr_andere_Stellvertretungen_erstellen_=C3=A4ndern_usw=2E_dadurch_ist_der_Schutz_der_Aktivi=C3=A4ten_Mails_nicht_gew=C3=A4hrt=... 

который является кодированием

[proconact-Verbesserung #279] (Neu) Stellvertretungen Benutzerrecht - andere können für andere Stellvertretungen erstellen ändern usw. dadurch ist der Schutz der Aktiviäten Mails nicht gewährt. 

Я искал способ сделать декодировать строку в кавычках.

Я попытался:

private static string DecodeQuotedPrintables(string input, string charSet) { 
    Encoding enc = new ASCIIEncoding(); 
    try { 
     enc = Encoding.GetEncoding(charSet); 
    } catch { 
     enc = new UTF8Encoding(); 
    } 

    var occurences = new Regex(@"(=[0-9A-Z]{2}){1,}", RegexOptions.Multiline); 
    var matches = occurences.Matches(input); 

    foreach (Match match in matches) { 
     try { 
      byte[] b = new byte[match.Groups[0].Value.Length/3]; 
      for (int i = 0; i < match.Groups[0].Value.Length/3; i++) { 
       b[i] = byte.Parse(match.Groups[0].Value.Substring(i * 3 + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
      } 
      char[] hexChar = enc.GetChars(b); 
      input = input.Replace(match.Groups[0].Value, hexChar[0].ToString()); 
     } catch { ;} 
    } 
    input = input.Replace("?=", "").Replace("=\r\n", ""); 

    return input; 
} 

, когда я звоню (где s моя строка)

var x = DecodeQuotedPrintables(s, "utf-8"); 

это вернет

=?utf-8?Q?[proconact_-_Verbesserung_#_(Neu)_Stellvertretungen_Benutzerrecht_-_andere_können_für_andere_Stellvertretungen_erstellen_ändern_usw._dadurch_ist_der_Schutz_der_Aktiviäten_Mails_nicht_gewährt=... 

Что я могу сделать, что будет также _ и начальный =?utf-8?Q?, а задний =.. будет удален?

+3

Это зло: 'try {...} catch {;}' –

+0

что вы должны в итоге? Какова конечная строка, которую вы пытаетесь извлечь из оригинальной? – balexandre

+0

Это оригинальная строка, которую я должен получить: [proconact-Verbesserung # 279] (Neu) Stellvertretungen Benutzerrecht - andere können für andere Stellvertretungen erstellen ändern usw. dadurch ist der Schutz der Aktiviäten Mails nicht gewährt. – BennoDual

ответ

5

Текст, который вы пытаетесь декодировать, обычно находится в заголовках MIME и кодируется в соответствии со спецификацией, определенной в следующем стандарте Интернета: RFC 2047: MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text.

Существует пример реализации такого декодера на GitHub; возможно, вы можете извлечь из него некоторые идеи: RFC2047 decoder in C#.

Вы также можете использовать этот онлайн-инструмент для сравнения своих результатов: Online MIME Headers Decoder.

Обратите внимание, что ваш образец текста неверен. Спецификация заявляет:

encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" 

в соответствии со спецификацией, любое закодированное слово обязательно конец в ?=.Таким образом, ваша выборка должна быть скорректирована с:

=?utf-8?Q?=5Bproconact_=2D_Verbesserung_=23=32=37=39=5D_=28Neu=29_Stellvertretungen_Benutzerrecht_=2D_andere_k=C3=B6nnen_f=C3=BCr_andere_Stellvertretungen_erstellen_=C3=A4ndern_usw=2E_dadurch_ist_der_Schutz_der_Aktivi=C3=A4ten_Mails_nicht_gew=C3=A4hrt= 

... к (прокручивать в крайнее правое положение):

=?utf-8?Q?=5Bproconact_=2D_Verbesserung_=23=32=37=39=5D_=28Neu=29_Stellvertretungen_Benutzerrecht_=2D_andere_k=C3=B6nnen_f=C3=BCr_andere_Stellvertretungen_erstellen_=C3=A4ndern_usw=2E_dadurch_ist_der_Schutz_der_Aktivi=C3=A4ten_Mails_nicht_gew=C3=A4hrt?= 

Строго говоря, ваш образец также недопустимо, так как оно превышает предел 75 символов, введенной на любом закодированном слове; однако большинство декодеров, как правило, терпимы к этому несоответствию.

-1

Я не слишком уверен в том, как удалить

=?utf-8?Q? 

Если это не кажется все время, если это произойдет, вы можете сделать это:

input = input.Split('?')[3]; 

Чтобы избавиться от отстающей «=» вы можете удалить его с помощью:

input = input.Remove(input.Length - 1); 

вы можете избавиться от «_», заменив его пробелом:

input = input.Replace("_", " "); 

Вы можете использовать эти фрагменты кода в своей функции DecodeQuotedPrintables.

Надеюсь, что это поможет!

0

После моего комментария я предлагаю

private static string MessedUpUrlDecode(string input, string encoding) 
{ 
    Encoding enc = new ASCIIEncoding(); 

    try 
    { 
     enc = Encoding.GetEncoding(charSet); 
    } 
    catch 
    { 
     enc = new UTF8Encoding(); 
    } 

    string messedup = input.Split('?')[3]; 
    string cleaned = input.Replace("_", " ").Replace("=...", ".").Replace("=", "%"); 

    return System.Web.HttpUtility.UrlDecode(cleaned, enc); 
} 

при условии, что калечат из строк источника соответствует.

2

Я тестировал 5+ из фрагментов кода, и это работает один: я изменил регулярок часть:

Тест линии:

im sistemlerimizde bak=FDm =E7al=FD=FEmas=FD yap=FDlaca=F0=FDndan; www.gib.= 

Пример вызова:

string encoding = "windows-1254"; 
    string input = "im sistemlerimizde bak=FDm =E7al=FD=FEmas=FD yap=FDlaca=F0=FDndan; www.gib.="; 
    DecodeQuotedPrintables(input, encoding); 

фрагмент кода:

private static string DecodeQuotedPrintables(string input, string charSet) 
    { 


     System.Text.Encoding enc = System.Text.Encoding.UTF7; 

     try 
     { 
      enc = Encoding.GetEncoding(charSet); 
     } 
     catch 
     { 
      enc = new UTF8Encoding(); 
     } 



     ////parse looking for =XX where XX is hexadecimal 
     //var occurences = new Regex(@"(=[0-9A-Z]{2}){1,}", RegexOptions.Multiline); 
     var occurences = new Regex("(\\=([0-9A-F][0-9A-F]))", RegexOptions.Multiline); 
     var matches = occurences.Matches(input); 

     foreach (Match match in matches) 
     { 
      try 
      { 
       byte[] b = new byte[match.Groups[0].Value.Length/3]; 
       for (int i = 0; i < match.Groups[0].Value.Length/3; i++) 
       { 
        b[i] = byte.Parse(match.Groups[0].Value.Substring(i * 3 + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       } 
       char[] hexChar = enc.GetChars(b); 
       input = input.Replace(match.Groups[0].Value, hexChar[0].ToString()); 
      } 
      catch 
      { ;} 
     } 
     input = input.Replace("?=", "").Replace("=\r\n", ""); 

     return input; 
    } 
0

Как уже упоминалось, standard class .NET существует для этой цели.

string unicodeString = 
      "=?UTF-8?Q?YourText?="; 
     System.Net.Mail.Attachment attachment = System.Net.Mail.Attachment.CreateAttachmentFromString("", unicodeString); 
     Console.WriteLine(attachment.Name); 
Смежные вопросы