电子邮件技术–Quoted-Printable编码(QP编码)详解

一、背景

Quoted-Printable编码可译为“可打印字符引用编码”,或者“使用可打印字符的编码”。

通常我们接收电子邮件,查看电子邮件原始信息,经常会看到这种类型的编码!电子邮件信头显示:Content-Transfer-Encoding: quoted-printable

它是多用途互联网邮件扩展(MIME) 一种实现方式。其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。目前http协议中,很多采用MIME框架!quoted-printable 就是说用一些可打印常用字符,表示一个字节(8位)中所有非打印字符方法!

二、Quoted-Printable编码方法

任何一个8位的字节值可编码为3个字符:一个等号“=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值。

例如:ASCII码换页符(十进制值为12)可以表示为”=0C”。

除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式。所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示,但是等号“=”(十进制值为61)不可以这样直接表示,等号”=”(十进制值为61)必须表示为”=3D”。ASCII的水平制表符(tab)与空格符(即:十进制为9和32),如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为“=09”(tab)或“=20”(space)。

如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的“=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.

Quoted-Printable编码的数据的每行长度不能超过76个字符。为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break)。 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中。

其实一个函数就可以,将所有字符串UrlEncode转换后,“%”号替换为“=”号,然后对非\r\n超过73连续字符,后面加一个=\r\n。这个是简单实现方法! 按照该编码详细说明里面,有些空格、换行,还有一些特殊字符可以不用转换。不过一起转换了,也不会有影响!

很多时候,我们用些常见字符表示所有8位其它非打印字符,这种通过Quoted-Printable编码,只是对该字节转为16进制后,做简单增加前缀!然后做些特殊字符处理即可! 它的简单,及编码高效,也让该编码在邮件格式里面,得到了广泛使用!

三、Python中的Quoted-Printable编码/解码方法

模块名称:quopri
主要函数:
encode,decode — 主要对文件进行编码/解码(也包括StringIO)
encodestring,decodestring — 主要对字符串进行编码解码

示例:

# vim: set ts=4 et sw=4 sts=4 fileencoding=utf-8 :
import quopri

a = "test"
b =  quopri.encodestring(a) # 对字符串编码
print b
print quopri.decodestring(b) # 对字符串解码

import StringIO

c = StringIO.StringIO()
d = StringIO.StringIO()
e = StringIO.StringIO()

c.write(a)
c.seek(0)

quopri.encode(c, d, 0)  # 编码StringIO中的数据, 第三个参数0表示不对空格和tab符号编码,为1表示进行编码
print d.getvalue()
d.seek(0)
quopri.decode(d, e)  # 解码StringIO中的数据
print e.getvalue()

f1 = open("test.txt", "w")
f1.write(a)
f1.close()

f1 = open("test1.txt", "r")
f2 = open("test2.txt", "w")

quopri.encode(f1, f2, 0) # 编码test1.txt中的数据到test2.txt

f1.close()
f2.close()

print open("test2.txt", "r").read()
原创声明:除非注明,本站文章均为原创!转载请注明来自 嗨!大佟! www.qmailer.net
本文链接:http://www.qmailer.net/archives/266.html

发表评论