跳到主要内容

6. Content-Transfer-Encoding 头字段

许多适合通过电子邮件传输的 media types, 在其 "natural" (自然) 格式中表示为 8 位字符数据或二进制数据. 这类数据无法通过某些传输协议传输. 例如, RFC 821 将邮件消息限制为 7-bit US-ASCII 数据, 且行长度不超过 1000 个字符. Content-Transfer-Encoding 字段用于指定已经应用了什么 encoding transformation (编码转换).

6.1. Content-Transfer-Encoding 语法

encoding := "Content-Transfer-Encoding" ":" mechanism

mechanism := "7bit" / "8bit" / "binary" /
"quoted-printable" / "base64" /
ietf-token / x-token

这些值不区分大小写: Base64, BASE64 和 bAsE64 都等价.

6.2. Content-Transfer-Encoding 语义

7bit

"7bit" 编码表示数据全部表示为 US-ASCII 数据的短行, 不含十进制值大于 127 的八位组. 不计 CRLF 时, 行长度不得超过 998 个八位组. 不允许 NUL 八位组 (十进制值 0). CR 和 LF 只能作为 CRLF 序列的一部分出现.

8bit

"8bit" 编码表示数据全部表示为相对较短的行, 在 CRLF 序列之间为 998 个八位组或更少, 但可以使用十进制值大于 127 的八位组. 与 "7bit" 数据一样, CR 和 LF 只能作为 CRLF 序列的一部分出现, 且不允许 NUL.

binary

"binary" 编码表示允许任意八位组序列. 本文档不进一步定义该编码.

quoted-printable

"quoted-printable" 编码旨在表示主要由与 US-ASCII 字符集中可打印字符对应的八位组组成的数据.

base64

"base64" 编码旨在以不需要人类可读的形式表示任意八位组序列.

6.3. 新的 Content-Transfer-Encodings

新的 Content-Transfer-Encoding 值可以向 IANA 注册. 这类注册要求在 RFC 2048 中规定.

6.4. 解释和使用

Content-Transfer-Encoding 值 "7bit", "8bit" 和 "binary" 都表示执行了 identity (即 NO, 无) 编码转换. 因此, 它们仅作为正文数据所在域的指示符, 并提供有用信息, 说明在给定传输系统中传输可能需要哪类编码.

6.5. 转换编码

允许传输非文本正文内容而不使用 Base64 或 Quoted-Printable 编码对其编码, 可能是可取的. "8bit" 和 "binary" 编码机制提供了这种功能.

6.6. 规范编码模型

这里定义的编码格式明确将所有数据编码为 ASCII. 因此, 如果被编码的数据不是 ASCII, 它必须首先使用某种字符编码转换为 ASCII. 该编码必须使用 Content-Type 字段中的 "charset" 参数声明.

6.7. Quoted-Printable Content-Transfer-Encoding

Quoted-Printable 编码使用可打印 ASCII 字符 (值为 33 到 126 的字符), 以允许对主要为文本的数据使用编码.

编码规则

  1. 除 "=" 外, 任何可打印 ASCII 字符 (十进制值 33 到 60 以及 62 到 126) 都可以按字面表示
  2. tab 和空格可以按字面表示, 除非它们出现在行尾
  3. 等号 "=" 用作转义字符
  4. 不可表示字符表示为 "=" 后跟两个表示该八位组值的十六进制数字
  5. 如果数据包含有意义的换行, 它们必须用 quoted-printable 编码表示
  6. 不计 CRLF 时, 编码行不得超过 76 个字符

示例

Original: If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy.

Encoded: If you believe that truth=3Dbeauty, then surely mathematics is the most =
beautiful branch of philosophy.

6.8. Base64 Content-Transfer-Encoding

Base64 Content-Transfer-Encoding 旨在以不需要人类可读的形式表示任意八位组序列.

编码过程

  1. 将输入数据流划分为 24 位 (3 个八位组) 的组
  2. 将每个 24 位组划分为四个 6 位组
  3. 将每个 6 位组映射到 Base64 字母表中的一个字符
  4. 如果最后一组少于 24 位, 用零位填充, 并在输出中添加 "=" 作为填充

Base64 Alphabet

Value Encoding  Value Encoding  Value Encoding  Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y

示例

Original (ASCII): Man
Binary: 01001101 01100001 01101110
Grouped 6-bit: 010011 010110 000101 101110
Base64: T W F u

编码输出格式

  • 编码输出流必须表示为每行不超过 76 个字符
  • 除最后一行外, 所有行必须正好为 76 个字符长
  • 编码数据中出现的任何 CRLF 对仅表示编码输出中的换行

编码对比:

编码用途行限制字符集膨胀
7bit纯 ASCII 文本998 字节US-ASCII
8bit扩展文本998 字节8 位八位组
binary二进制数据任意
quoted-printable主要为 ASCII76 字符ASCII + 转义约 1-3 倍
base64任意二进制76 字符64 字符约 1.33 倍

选择指南:

  • 纯 ASCII 文本: 7bit (无需编码)
  • 偶尔含非 ASCII 的文本: quoted-printable (可读性更好)
  • 二进制数据 (图像, 附件): base64 (标准方法)
  • 现代系统: 8bitbinary (如果支持)