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 的字符), 以允许对主要为文本的数据使用编码.
编码规则
- 除 "=" 外, 任何可打印 ASCII 字符 (十进制值 33 到 60 以及 62 到 126) 都可以按字面表示
- tab 和空格可以按字面表示, 除非它们出现在行尾
- 等号 "=" 用作转义字符
- 不可表示字符表示为 "=" 后跟两个表示该八位组值的十六进制数字
- 如果数据包含有意义的换行, 它们必须用 quoted-printable 编码表示
- 不计 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 旨在以不需要人类可读的形式表示任意八位组序列.
编码过程
- 将输入数据流划分为 24 位 (3 个八位组) 的组
- 将每个 24 位组划分为四个 6 位组
- 将每个 6 位组映射到 Base64 字母表中的一个字符
- 如果最后一组少于 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 | 主要为 ASCII | 76 字符 | ASCII + 转义 | 约 1-3 倍 |
| base64 | 任意二进制 | 76 字符 | 64 字符 | 约 1.33 倍 |
选择指南:
- 纯 ASCII 文本: 7bit (无需编码)
- 偶尔含非 ASCII 的文本: quoted-printable (可读性更好)
- 二进制数据 (图像, 附件): base64 (标准方法)
- 现代系统: 8bit 或 binary (如果支持)