跳到主要内容

3. ABNF

文本编码的 ABNF [RFC5234] 如下:

textualmsg = preeb *WSP eol
*eolWSP
base64text
posteb *WSP [eol]

preeb = "-----BEGIN " label "-----" ; 与 [RFC1421] (A)BNF 不同,
; eol 不是必需的 (但请参见
posteb = "-----END " label "-----" ; [RFC1421], 第 4.4 节)

base64char = ALPHA / DIGIT / "+" / "/"

base64pad = "="

base64line = 1*base64char *WSP eol

图 1: ABNF (标准)

base64finl = *base64char (base64pad *WSP eol base64pad /
*2base64pad) *WSP eol
; ...AB= <EOL> = <EOL> 不好, 但是有效

base64text = *base64line base64finl
; 我们也可以使用来自 RFC 1421 的 <encbinbody>,
; 它要求 16 组 4 个字符, 这意味着每行
; 恰好 64 个字符, 除了最后一行, 但这更准确

labelchar = %x21-2C / %x2E-7E ; 任何可打印字符,
; 除了连字符减号

label = [ labelchar *( ["-" / SP] labelchar ) ] ; 可以为空

eol = CRLF / CR / LF

eolWSP = WSP / CR / LF ; 与 LWSP 比较

图 1: ABNF (标准) 续

laxtextualmsg    = *W preeb
laxbase64text
posteb *W

W = WSP / CR / LF / %x0B / %x0C ; 空白

laxbase64text = *(W / base64char) [base64pad *W [base64pad *W]]

图 2: ABNF (宽松)

stricttextualmsg = preeb eol
strictbase64text
posteb eol

strictbase64finl = *15(4base64char) (4base64char / 3base64char
base64pad / 2base64char 2base64pad) eol

base64fullline = 64base64char eol

strictbase64text = *base64fullline strictbase64finl

图 3: ABNF (严格)

新的实现应该发出上面指定的严格格式 (图 3)。解析策略的选择取决于使用的上下文。