介绍Quote-Printable编码。


MIME定义了两种编码方法,其中一种是BASE64,另一种是Quote-Printable,即QP编码。前一种大家应该很熟悉,而后一种相对陌生。


前面已经介绍过MIME格式:

MIME格式解析


本文将介绍QP编码。


01

原理


QP编码是一种使用可打印的ASCII字符 (如字母、数字与"=")表示各种编码格式下的字符。其方法是将一个8bit的字符表示成两个16进制数,并在前面加一个“=”,共三个ASCII字符。


经过QP编码后的数据,通常是下面这个样子:

=E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90=E4=B8=8E=E8=BF=98=E5=8E=9F


对QP编码而言,所有ASCII字符都可以直接用ASCII字符编码来直接表示,但是有一个例外,就是字符“=”,它将在QP编码中根据其十进制值被编码为“=3D”,因为它在编码过程中被使用。


另外,对制表符和空格符,即tab和space,虽然规定如果不出现在行尾可以用其ASCII字符编码直接表示,在行尾才需要被编码,但是实际应用中基本上都是统一处理,分别表示为“=09”(tab)和“=20”(space)。


而数据中的换行,即行结束标志,则需要转换为回车加换行,最终为0x0d0x0a,而最终的编码则是“=0D=0A”。


QP编码规定编码后的数据每行不能超过76个字符。当超过这个限制时,将在编码结果中使用软换行进行分行,即每75个字符后增加一个“=”,然后再接上换行CRLF,之后开始新的一行,这个“=”在解码的时候并不会解出任何数据。


02


例子


回头再看上文中的QP编码数据:

=E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90=E4=B8=8E=E8=BF=98=E5=8E=9F


解码后即为"协议分析与还原"UTF8编码,每三个字节表示一个汉字:

QP编码详解_编码算法

可以看出,对QP编码进行解码相当简单,即将可见字符中除行结束外的每个“=”之后的两个ASCII字符直接当成一个16进制数值进行处理即可。


至于解QP编码的工具,网上很多,这里给一个:

http://web.chacuo.net/charsetquotedprintable


有什么问题,可联系我交流。

QP编码详解_编码算法_02

长按进行关注。