跳到主要内容

2. 定义, 约定和通用 BNF 语法

虽然 MIME 机制在整个文档集中以说明文字规定, 其中许多机制也使用 RFC 822 的 augmented BNF (扩展 BNF) 表示法进行形式化描述. 实现者需要熟悉这种表示法才能理解本文档集; 关于 augmented BNF 表示法的完整解释, 请参见 RFC 822.

本文档集中的部分 augmented BNF 会按名称引用 RFC 822 中定义的语法规则. 因此, 完整形式语法由本文档集中每个文档收集的语法附录, RFC 822 的语法, 以及 RFC 1123 对 RFC 822 定义的修改共同组合而成; RFC 1123 特别更改了 return, datemailbox 的语法.

本文档集中的所有数值和 octet (八位组) 值均以十进制表示. 所有已定义的 media type 值, subtype 值和参数名都不区分大小写. 但是, 除非特定参数另有规定, 参数值区分大小写.

格式说明: 像这样的说明提供额外的非必要信息, 读者可以跳过而不会遗漏任何关键内容. 这些非必要说明的主要目的, 是传达本文档集设计理由的信息, 或将这些文档放入适当的历史或演进上下文中. 特别是, 只专注于构建合规实现的读者可以跳过这类信息, 但希望理解为何作出某些设计选择的读者可能会发现它们有用.

2.1. CRLF

本文档集中的术语 CRLF 指与两个 US-ASCII 字符 CR (十进制值 13) 和 LF (十进制值 10) 对应的八位组序列; 二者按此顺序组合, 表示 RFC 822 邮件中的换行.

2.2. Character Set

MIME 中使用术语 "character set" (字符集) 指将八位组序列转换为字符序列的方法. 注意, 并不要求反方向转换是无条件且无歧义的, 因为并非所有字符都能由给定字符集表示, 而且一个字符集可以提供多个八位组序列来表示某个特定字符序列.

该定义旨在允许各种字符编码, 从 US-ASCII 这样的简单单表映射, 到使用 ISO 2022 技术的复杂表切换方法. 但是, 与 MIME 字符集名称关联的定义 MUST (必须) 完整规定要执行的映射. 特别是, 不允许使用外部配置文件信息来确定确切映射.

说明: 术语 "character set" 最初用于描述 US-ASCII 和 ISO-8859-1 这类事物, 它们由一小组字符以及从单个八位组到单个字符的简单一对一映射组成. 多八位组编码字符集和切换技术使情况复杂得多. 例如, 一些社区将 MIME 所称的 "character set" 称为 "character encoding", 同时使用短语 "coded character set" 表示从整数 (不是八位组) 到字符的抽象映射.

2.3. Message

术语 "message" (消息) 在未进一步限定时, 指网络上传输的完整或 "top-level" (顶层) 消息, 或封装在类型为 "message/rfc822" 或 "message/partial" 的正文中的消息.

2.4. Entity

术语 "entity" (实体) 专门指消息或 multipart 正文中某个部分的 MIME 定义头字段和内容. 对这类实体的规定是 MIME 的核心. 由于实体内容常被称为 "body" (正文), 因而谈论实体的正文是合理的. 实体头部中可以出现任何类型的字段, 但只有名称以 "content-" 开头的字段才实际具有 MIME 相关含义. 注意, 这并不意味着其他字段完全没有含义: 同时也是消息的实体具有非 MIME 头字段, 其含义由 RFC 822 定义.

2.5. Body Part

术语 "body part" (正文部分) 指 multipart entity (多部分实体) 内部的实体.

2.6. Body

术语 "body" (正文) 在未进一步限定时, 指实体的正文, 即消息的正文或 body part 的正文.

说明: 前四个定义显然是循环的. 这是不可避免的, 因为 MIME 消息的整体结构确实是递归的.

2.7. 7bit Data

"7bit data" (7 位数据) 指全部表示为相对较短行的数据, 在 CRLF 行分隔序列之间为 998 个八位组或更少 [RFC-821]. 不允许出现十进制值大于 127 的八位组, 也不允许出现 NUL (十进制值为 0 的八位组). CR (十进制值 13) 和 LF (十进制值 10) 八位组只能作为 CRLF 行分隔序列的一部分出现.

2.8. 8bit Data

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

2.9. Binary Data

"Binary data" (二进制数据) 指允许任意八位组序列的数据.

2.10. Lines

"Lines" (行) 定义为由 CRLF 序列分隔的八位组序列. 这与 RFC 821 和 RFC 822 均一致. "Lines" 只指消息中的数据单位, 它可能对应, 也可能不对应用户代理实际显示的内容.


术语摘要:

术语描述
Character Set将八位组序列转换为字符序列的方法
MessageRFC 822 消息或被封装的消息
EntityMIME 头字段和内容
Body Partmultipart 实体内的实体
Body实体的内容
7bit Data仅 US-ASCII, 无高位八位组, 短行
8bit Data允许高位八位组, 短行
Binary Data允许任意八位组序列
Lines由 CRLF 分隔的八位组序列

关键概念:

  • MIME 结构是递归的 (实体可以包含实体)
  • 参数名不区分大小写, 但参数值通常区分大小写
  • CRLF 是唯一的行分隔形式
  • 数据分为 7bit, 8bit 和 binary 类型