Кодировка Quoted-Printable UTF-8 - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте ! Пытаюсь раскодировать Quoted-Printable строку... код работает нормально для любой кодировки, кроме UTF-8, я не знаю, почему он не может декодировать UTF-8. Как декодировать Quoted-Printable строку UTF-8 (кириллица) в нормальный читаемый вид?
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)
                                                                          {
                                                                              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);
                                                                              }
                                                                              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 + 1);
            }
            else
            {
                // No match, not encoded, return original string
                decodedString += encodedString;
                break;
            }
        }
        return decodedString;
    }

Решение задачи: «Кодировка Quoted-Printable UTF-8»

textual
Листинг программы
public static string DecodeEncodedWordValue(string mimeString) // перевод темы и отправителя письма из кодировки  quoted printable
        {
            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)
                {
                    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)
                            {
                                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);
                                }
                                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;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5