Skip to main content

2. URN 语法 (URN Syntax)

如上所述,本规范中 URN 的语法允许比早期规范(最近的是 [RFC2141])更多的功能。它也与通用 URI 语法 [RFC3986] 协调一致(必须注意的是,该规范是在早期 URN 规范之后完成的)。

但是,本规范不扩展 URN 语法以允许直接使用 ASCII 范围 [RFC20] 之外的字符。该限制意味着任何此类字符都需要按照 URI 规范 [RFC3986] 第 2.1 节中的描述进行百分号编码。

URN 的基本语法使用增强巴科斯-瑙尔范式 (Augmented Backus-Naur Form, ABNF) 定义,如 [RFC5234] 中所述。此处未定义的规则(具体为:alphanum、fragment 和 pchar)作为 URI 语法 [RFC3986] 的一部分定义,并在此处用于指出与那里使用的术语的语法关系。下面使用的某些术语的定义不是全面的;特定于这些术语的本文档各节的散文施加了额外的限制(特别是第 2.3.1 节中的 r-component 和第 2.3.2 节中的 q-component)。

namestring    = assigned-name
[ rq-components ]
[ "#" f-component ]
assigned-name = "urn" ":" NID ":" NSS
NID = (alphanum) 0*30(ldh) (alphanum)
ldh = alphanum / "-"
NSS = pchar *(pchar / "/")
rq-components = [ "?+" r-component ]
[ "?=" q-component ]
r-component = pchar *( pchar / "/" / "?" )
q-component = pchar *( pchar / "/" / "?" )
f-component = fragment

问号字符 "?" 可以在 r-component、q-component 和 f-component 内部使用而无需百分号编码。除了在这些组件内部之外,后面不紧跟 "=" 或 "+" 的 "?" 未为 URN 定义,URN 特定的解析器和其他处理器应将其视为语法错误。

以下各节提供有关 URN 的语法元素的附加信息。