C#中是否存在可以将Quoted-Printable编码转换为的现有类String?单击上面的链接以获取有关编码的更多信息。
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个字符。为了在不更改编码文本的情况下满足此要求,可以根据需要添加换行符。换行符在编码行的末尾包含“ =”,并且不会在解码文本中引起换行。
任何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个字符。为了在不更改编码文本的情况下满足此要求,可以根据需要添加换行符。换行符在编码行的末尾包含“ =”,并且不会在解码文本中引起换行。
框架库中有执行此操作的功能,但似乎没有完全暴露出来。实现在内部类中System.Net.Mime.QuotedPrintableStream。此类定义了一个调用方法DecodeBytes,该方法可以执行所需的操作。该方法似乎仅由一种用于解码MIME标头的方法使用。该方法也是内部的,但是在几个地方(例如,Attachment.Namesetter )被相当直接地调用。演示:
System.Net.Mime.QuotedPrintableStream
DecodeBytes
Attachment.Name
using System; using System.Net.Mail; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Attachment attachment = Attachment.CreateAttachmentFromString("", "=?iso-8859-1?Q?=A1Hola,_se=F1or!?="); Console.WriteLine(attachment.Name); } } }
产生输出:
嗨,塞纳尔!
您可能必须进行一些测试以确保正确地处理回车等,尽管在快速测试中我确实如此。但是,除非您的用例足够接近MIME头字符串的解码,并且您认为该头不会因对库的任何更改而破坏,否则依赖此功能可能不是明智的选择。您最好编写自己的带引号的可打印解码器。