一尘不染

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

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


阅读 207

收藏
2020-05-19

共1个答案

一尘不染

框架库中有执行此操作的功能,但似乎没有完全暴露出来。实现在内部类中System.Net.Mime.QuotedPrintableStream。此类定义了一个调用方法DecodeBytes,该方法可以执行所需的操作。该方法似乎仅由一种用于解码MIME标头的方法使用。该方法也是内部的,但是在几个地方(例如,Attachment.Namesetter
)被相当直接地调用。演示:

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头字符串的解码,并且您认为该头不会因对库的任何更改而破坏,否则依赖此功能可能不是明智的选择。您最好编写自己的带引号的可打印解码器。

2020-05-19