6. Content-Transfer-Encoding Header Field (Content-Transfer-Encoding头部字段)
许多媒体类型可以使用多种编码来表示. 例如, 某些媒体类型可能包含8位字符数据, 而某些传输协议仅支持7位字符集. 在其他情况下, 使用编码可以使文本消息在某些传输协议上更可靠地传输. Content-Transfer-Encoding字段用于指定应用了何种编码转换.
6.1. Content-Transfer-Encoding Syntax (语法)
encoding := "Content-Transfer-Encoding" ":" mechanism
mechanism := "7bit" / "8bit" / "binary" /
"quoted-printable" / "base64" /
ietf-token / x-token
这些值不区分大小写——例如, Base64和BASE64是等效的.
6.2. Content-Transfer-Encoding Semantics (语义)
7bit
"7bit"编码意味着数据全部以短行表示, 行间有998个八位字节或更少, 使用CRLF行分隔序列. 不允许十进制值大于127的八位字节, 也不允许NUL八位字节 (十进制值0). CR和LF仅作为CRLF序列的一部分出现.
8bit
"8bit"编码意味着数据全部以相对较短的行表示, 使用CRLF行分隔序列, 但允许使用十进制值大于127的八位字节. 与"7bit"数据一样, CR和LF仅作为CRLF序列的一部分出现, 不允许NUL.
binary
"binary"编码表示任意八位字节序列. 此编码未在本文档中进一步定义.
quoted-printable
"quoted-printable"编码旨在表示主要由US-ASCII文本组成但偶尔包含不可打印字符的数据.
base64
"base64"编码旨在表示任意八位字节序列, 以可以可靠地通过邮件网关传输的形式.
6.7. Quoted-Printable Content-Transfer-Encoding
Quoted-Printable编码使用可打印的ASCII字符 (字符值33到126) 表示数据, 以允许在很大程度上是文本的数据上使用编码.
编码规则
- 除换行符外的任何可打印ASCII字符 (十进制值33到60和62到126) 都可以按字面表示
- 制表符和空格可以按字面表示, 除非它们出现在行尾
- 等号"="用作转义字符
- 非字面表示的字符表示为等号后跟两个十六进制数字, 表示该字符的八位字节值
- 如果数据包含有意义的行分隔, 则必须使用quoted-printable编码表示它们
- 编码行的长度不得超过76个字符, 不包括CRLF
示例
原文: If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy.
编码: If you believe that truth=3Dbeauty, then surely mathematics is the most =
beautiful branch of philosophy.
6.8. Base64 Content-Transfer-Encoding
Base64内容传输编码旨在表示任意八位字节序列, 以可能需要通过邮件传输的形式编码.
编码过程
- 将输入数据流分成24位组 (3个八位字节)
- 将每组24位分成四组6位
- 将每组6位映射到Base64字母表中的一个字符
- 如果最后一组少于24位, 则用零位填充并在输出中添加"="作为填充
Base64字母表
值 编码 值 编码 值 编码 值 编码
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
示例
原文 (ASCII): Man
二进制: 01001101 01100001 01101110
分组6位: 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-3x |
| base64 | 任意二进制 | 76字符 | 64个字符 | ~1.33x |
选择指南:
- 纯ASCII文本: 7bit (无需编码)
- 偶尔有非ASCII的文本: quoted-printable (可读性好)
- 二进制数据 (图片、附件): base64 (标准方法)
- 现代系统: 8bit 或 binary (如果支持)