为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信