4

次の文字列があります。

=?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?と末尾=..も削除されるようにするにはどうすればよいですか?

4

5 に答える 5

5

デコードしようとしているテキストは通常​​、MIME ヘッダーにあり、次のインターネット標準で定義されている仕様に従ってエンコードされています: RFC 2047: MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text .

このようなデコーダーのサンプル実装が GitHub にあります。そこからいくつかのアイデアを引き出すことができるかもしれません: C# の RFC2047 デコーダー

このオンライン ツールを使用して結果を比較することもできます: 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 文字の制限を超えているため、サンプルも無効です。ただし、ほとんどのデコーダは、この不適合を許容する傾向があります。

于 2012-05-05T09:14:31.190 に答える
3

私は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;
    }
于 2013-12-07T21:16:06.287 に答える
3

標準クラスで述べたように、 .NETはこの目的のために存在します。

string unicodeString =
            "=?UTF-8?Q?YourText?=";
        System.Net.Mail.Attachment attachment = System.Net.Mail.Attachment.CreateAttachmentFromString("", unicodeString);
        Console.WriteLine(attachment.Name);
于 2015-10-10T20:11:11.760 に答える
1

私のコメントに続いて、私は提案します

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

ソース文字列の切断が一貫していると仮定します。

于 2012-05-05T08:56:05.983 に答える