Skip to main content

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) 表示数据, 以允许在很大程度上是文本的数据上使用编码.

编码规则

  1. 除换行符外的任何可打印ASCII字符 (十进制值33到60和62到126) 都可以按字面表示
  2. 制表符和空格可以按字面表示, 除非它们出现在行尾
  3. 等号"="用作转义字符
  4. 非字面表示的字符表示为等号后跟两个十六进制数字, 表示该字符的八位字节值
  5. 如果数据包含有意义的行分隔, 则必须使用quoted-printable编码表示它们
  6. 编码行的长度不得超过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内容传输编码旨在表示任意八位字节序列, 以可能需要通过邮件传输的形式编码.

编码过程

  1. 将输入数据流分成24位组 (3个八位字节)
  2. 将每组24位分成四组6位
  3. 将每组6位映射到Base64字母表中的一个字符
  4. 如果最后一组少于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主要ASCII76字符ASCII + 转义~1-3x
base64任意二进制76字符64个字符~1.33x

选择指南:

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