C#:解码带引号可打印编码的类?

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个字符。为了在不更改编码文本的情况下满足此要求,可以根据需要添加换行符。换行符在编码行的末尾包含“ =”,并且不会在解码文本中引起换行。


哔哔one
浏览 407回答 3
3回答

蝴蝶不菲

我扩展了马丁·墨菲(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;}
打开App,查看更多内容
随时随地看视频慕课网APP