这篇文章是我之前在RYTong内部分享的一篇文章,摘取了有用的部分。当时帮助某项目邮件系统解决问题,期间了解到Quoted-Printable编码,在此与大家分享下该编码的原理和个人版本的代码实现。
关于规范
关于Quoted-Printable的编码规范,需要参考rfc2045。
为了方便大家阅读,在此给大家看一下融合我个人理解的翻译:
除了换行(CRLF序列)中的CR或LF,所有(8bit)字节都可以表示为符号”=”后跟两个16进制数字(16进制数字表示该字节的值)的格式,16进制数字只能有数字和大写ABCDEF表示,不能用小写字母。例如,ASCII码换页符,数值为12,编码后表示为”=0C”。
值为33到126的字节(除61外),包含边界,也可以不进行编码。
制表符(值为9)和空格(值为32)可以不进行编码,但未编码的两者不能位于编码后的行尾。如果行尾由软换行符(符号”=”,参照规则5)时,软换行符前的制表符和空格可以不编码。两者若在行尾则必须编码。
换行(CRLF序列)不必进行编码。因为只有CRLF序列表示换行,因此包含CR或LF的其他序列须进行编码。
Quoted-Printable编码要求编码后的文本每行长度不得超过76字符。如果原文的一行被编码后的文本长度超过76,那么需要在编码后的行尾添加软换行符”=”,表示原文此处没有换行。注意软换行符”=”也会计入编码后的字节长度,也就是说如果编码后行尾存在软换行符,那么该行其他字符数不得超过75。
建议对-!\”#$@[\]^`{|}~进行编码,以避免对其他协议或少数网关(如EBCDIC)的处理造成影响。
建议对CRLF序列进行编码,避免各平台不同的换行序列对解码造成影响。
关于代码实现
以下是本人基于以上规则实现的代码(Erlang实现)
-module(qp_encoder).
-export([qp_encode/1]).
-define(LINE_LENGTH, 76).
-define(is_suggested(C),
C == 45 orelse C == 64 orelse C == 96 orelse C == 46 orelse
(C >= 33 andalso C =< 36) orelse
(C >= 91 andalso C =< 94) orelse
(C >= 123 andalso