这两者之间有什么区别?哪一个是推荐的?在电子邮件正文中是否需要特殊编码以设置这些头部?
这段内容可能有些晦涩难懂,但是RFC 1341的“Content-Transfer-Encoding”部分包含了所有细节:
http://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
The situation is getting worse. Here's my summary:请注意,当您选择7bit
时,您同意您内容中的所有行的长度都不超过1000个字符。
只要您的内容遵循这些规则,7bit
就是最好的传输编码,因为没有额外的工作需要处理;您只需按照字节的顺序读写即可。同时,7bit
内容易于理解。这里的想法是,如果您只是写“纯英语文本”,那么就没问题了。但是这在2005年不是真的,今天也不是。
8bit
表示“我的数据可能包括扩展ASCII字符;它们可能使用第8(最高)位来指示标准US-ASCII 7位字符以外的特殊字符。”与7bit
一样,仍然有1000个字符的行限制。
8位
"和"7位
"一样,在数据写入或从网上读取时不会转换任何字节。只是表示您不能保证没有任何一个字节的最高位设置为"1"。7位
"更有用,因为它使您在内容方面更加自由。然而,RFC 1341包含了这个小提示:
RFC 1341出版已有20多年。此后我们得到了RFC 6152中的8位MIME扩展名。但即使如此,仍可能适用行限制。截至本文件发布时,在标准化的Internet传输协议中,无法在邮件正文中包含未编码的8位或二进制数据。因此,在Internet上实际上不存在适用于"8bit"或"binary"内容传输编码的情况。
binary
与 8bit
相同,只是没有行长度限制。您仍然可以包含任何字符,并且没有额外的编码。类似于 8bit
,RFC 1341 指出它并不是一个真正合法的编码传输编码。RFC 3030 使用 BINARYMIME
扩展了此功能。
8BITMIME
扩展程序之前,需要一种方法来通过 SMTP 发送无法使用 7bit
的内容。HTML 文件(可能具有超过 1000 个字符的行)和带有国际字符的文件是很好的例子。设计了 quoted-printable
编码(在 RFC 1341 的第 5.1 节中定义)来处理此问题。它做了两件事:
引用可打印格式由于转义和短行比7bit
或8bit
更难被人类阅读,但它支持更广泛的可能内容。
如果您的数据主要是非文本(例如:图像文件),您没有太多选择。7bit
不适用。8bit
和binary
在MIME扩展RFC之前不受支持。quoted-printable
可以工作,但效率非常低下(每个字节将由3个字符表示)。
base64
是这种类型数据的一个好的解决方案。它将3个原始字节编码为4个US-ASCII字符,相对高效。RFC 1341进一步限制了base64
编码数据的行长度为76个字符以适应SMTP消息,但当您只是在固定长度处拆分或连接任意字符时,这相对容易管理。最大的缺点是base64
编码数据几乎完全无法被人类阅读,即使在其底层只是“纯文本”。使用content-transfer-encoding: 7bit,在正文中使用的字节(或更准确地说,在部件的边界内)应该表示ASCII字符,而不是扩展ASCII字符。这意味着0-127十进制(第8位未使用)。
由于第8位未使用,这意味着您不能使用utf-8
或iso8859-7
字节来编码文本,因为它们使用第8位。也不能添加二进制内容。
使用content-transfer-encoding: 8bit,您可以使用任何可能的字节,这意味着您可以使用utf-8
字节或iso8859-7
字节来编码文本(都假定在SMTP中使用了8BITMIME
扩展)。但是,由于仍然适用于最大行限制,仍然不安全添加二进制内容,这可能会使您的字节断开并带有换行符。
即使使用7bit content-transfer-encoding,只要您仍将字节保持在0-127的边界之间,仍然可以将content-type
的charset
参数设置为utf-8
。
用7bit
内容传输编码来表示ASCII之外的字符的一种可能方式是使用HTML代码字符(带content-type:text / html
)。
许多电子邮件客户端将根据情况将content-transfer-encoding
设置为7bit
或8bit
。例如,发送英文文本时使用7bit
,发送多语言文本时使用8bit
。还有quoted-printable
和base64
的选项,它们的字符也不使用第8位,但这超出了问题的范围。