亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#:解碼帶引號可打印編碼的類?

C#:解碼帶引號可打印編碼的類?

C#
嗶嗶one 2019-11-18 13:44:45
C#中是否存在可以將Quoted-Printable編碼轉換為的現有類String?單擊上面的鏈接以獲取有關編碼的更多信息。為了方便起見,以上鏈接引用了以下內容。任何8位字節值都可以用3個字符編碼,“ =”后跟兩個十六進制數字(0–9或A–F),表示字節的數字值。例如,US-ASCII換頁字符(十進制值12)可以用“ = 0C”表示,而US-ASCII等號(十進制值61)可以用“ = 3D”表示。除可打印ASCII字符或行尾字符以外的所有字符都必須以這種方式編碼。除“ =”(十進制61)外,所有可打印的ASCII字符(十進制值在33到126之間)都可以由它們自己表示。ASCII制表符和空格字符(十進制值9和32)可以由它們自己表示,除非這些字符出現在行尾。如果這些字符之一出現在行尾,則必須將其編碼為“ = 09”(制表符)或“ = 20”(空格)。如果要編碼的數據包含有意義的換行符,則必須將其編碼為ASCII CR LF序列,而不是其原始字節值。相反,如果字節值13和10的含義不是行尾,則必須將其編碼為= 0D和= 0A。帶引號的可打印編碼數據行不得超過76個字符。為了在不更改編碼文本的情況下滿足此要求,可以根據需要添加換行符。換行符在編碼行的末尾包含“ =”,并且不會在解碼文本中引起換行。
查看完整描述

3 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

我擴展了馬丁·墨菲(Martin Murphy)的解決方案,希望它在每種情況下都能奏效。


private static string DecodeQuotedPrintables(string input, string charSet)

{           

    if (string.IsNullOrEmpty(charSet))

    {

        var charSetOccurences = new Regex(@"=\?.*\?Q\?", RegexOptions.IgnoreCase);

        var charSetMatches = charSetOccurences.Matches(input);

        foreach (Match match in charSetMatches)

        {

            charSet = match.Groups[0].Value.Replace("=?", "").Replace("?Q?", "");

            input = input.Replace(match.Groups[0].Value, "").Replace("?=", "");

        }

    }


    Encoding enc = new ASCIIEncoding();

    if (!string.IsNullOrEmpty(charSet))

    {

        try

        {

            enc = Encoding.GetEncoding(charSet);

        }

        catch

        {

            enc = new ASCIIEncoding();

        }

    }


    //decode iso-8859-[0-9]

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

    var matches = occurences.Matches(input);

    foreach (Match match in matches)

    {

        try

        {

            byte[] b = new byte[] { byte.Parse(match.Groups[0].Value.Substring(1), System.Globalization.NumberStyles.AllowHexSpecifier) };

            char[] hexChar = enc.GetChars(b);

            input = input.Replace(match.Groups[0].Value, hexChar[0].ToString());

        }

        catch { }

    }


    //decode base64String (utf-8?B?)

    occurences = new Regex(@"\?utf-8\?B\?.*\?", RegexOptions.IgnoreCase);

    matches = occurences.Matches(input);

    foreach (Match match in matches)

    {

        byte[] b = Convert.FromBase64String(match.Groups[0].Value.Replace("?utf-8?B?", "").Replace("?UTF-8?B?", "").Replace("?", ""));

        string temp = Encoding.UTF8.GetString(b);

        input = input.Replace(match.Groups[0].Value, temp);

    }


    input = input.Replace("=\r\n", "");

    return input;

}


查看完整回答
反對 回復 2019-11-18
  • 3 回答
  • 0 關注
  • 473 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號