1

stackoverflow の最近のスレッドに従って、新しい質問を投稿します。エンコーディング タイプを抽出したい文字列がいくつかあります。私は正規表現を使って喜んでそれを行います:

例:

utf-8 quoted printable
string str = "=?utf-8?Q?=48=69=67=68=2d=45=6e=64=2d=44=65=73=69=67=6e=65=72=2d=57=61=74=63=68=2d=52=65=70=6c=69=63=61=73=2d=53=61=76=65=2d=54=48=4f=55=53=41=4e=44=53=2d=32=30=31=32=2d=4d=6f=64=65=6c=73?=";

utf-8 Base 64
string fld4 = "=?utf-8?B?VmFsw6lyaWUgTWVqc25lcm93c2tp?= <Valerie.renamed@company.com>";

Windows 1258 Base 64
 string msg2= "=?windows-1258?B?UkU6IFRyIDogUGxhbiBkZSBjb250aW51aXTpIGQnYWN0aXZpdOkgZGVz?= =?windows-1258?B?IHNlcnZldXJzIFdlYiBHb1ZveWFnZXN=?=";

iso-8859-1 Quoted printable 
string fld2 = "=?iso-8859-1?Q?Fr=E9d=E9ric_Germain?= <Frederic.Germain@company.com>";

等...

一般的なデコード関数を作成するには、以下を抽出する必要があります。

  • 文字セット (utf-8、Windows1258 など...)

  • transfert エンコーディング タイプ (引用された printable または base 64)

  • エンコードされた文字列

?xxx?Q 間のパターンを抽出する方法はありますか? または?xxx?B?

注: これは大文字でも小文字でもかまいません

ありがとう。

4

2 に答える 2

1

これがあなたのためにそれを行うRubularです。つまり、この正規表現=\?(.*?)\?[QBqb]はそのエンコーディングを取得します。ただし、注意すべきことの 1 つは、結果を取得するときに、指定した 3 番目の例には 2 つの一致が含まれているため、2 番目の一致で何をしたいかを必ず決定してください。

于 2013-07-10T20:35:12.110 に答える
-1

ここに完全な実用的なソリューションがあります

public class Encoded
    {
        public string Charset;
        public string ContentTransfertEncoding;
        public string Data;
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;

    namespace ConsoleApplication2
    {
     public class Decoding
{

    public Decoding()
    {

    }

    public List<Encoded> Process(string data)
    {
        List<Encoded> list = new List<Encoded>();

        var occurences = new Regex(@"=\?[a-zA-Z0-9?=-]*\?[BbQq]\?[a-zA-Z0-9?=-]*\?=", RegexOptions.IgnoreCase);
        var matches = occurences.Matches(data);
        foreach (Match match in matches)
        {
            Encoded cls = new Encoded();
            cls.Data = match.Groups[0].Value;
            cls.Charset = GetCharset(cls.Data);                
            cls.ContentTransfertEncoding = GetContentTransfertEncoding(cls.Data);

            // cleanup data
            int pos = cls.Data.IndexOf("=?");
            pos = cls.Data.IndexOf("?",pos+ 2);
            cls.Data = cls.Data.Substring(pos + 3);
            cls.Data = cls.Data.Replace("?=", "");                
            list.Add(cls);
        }
        return list;            
    }

    private string GetContentTransfertEncoding(string data)
    {
        var occurences = new Regex(@"=\?(.*?)\?[QBqb]", RegexOptions.IgnoreCase);
        var matches = occurences.Matches(data);

        foreach (Match match in matches)
        {
            int pos = match.Groups[0].Value.LastIndexOf('?');

            return match.Groups[0].Value.Substring(pos+1);

        }
        return data;
    }

    public string GetCharset(string data)
    {
        var occurences = new Regex(@"=\?(.*?)\?[QBqb]", RegexOptions.IgnoreCase);
        var matches = occurences.Matches(data);

        foreach (Match match in matches)
        {
            string str1 = match.Groups[0].Value.Replace("=?", "");
            int pos = str1.IndexOf('?');
            str1 = str1.Substring(0, pos);
            return str1; // there should be only 1 match
        }
        return data;
    }

    public string Decodeetc...()
   }
于 2013-07-10T21:23:03.790 に答える