跳到主要内容

2. URN 语法

如上所述, 本规范中的 URN syntax 相比早期规范 (最近的是 [RFC2141]) 允许显著更多的功能. 它也与通用 URI syntax [RFC3986] 保持协调 (需要注意, RFC 3986 是在早期 URN 规范之后完成的).

然而, 本规范并未扩展 URN syntax 以允许直接使用 ASCII 范围 [RFC20] 之外的字符. 该限制意味着任何此类字符都需要按照 URI 规范 [RFC3986] 第 2.1 节所述进行 percent-encoding.

URN 的基本语法使用 [RFC5234] 中规定的 Augmented Backus-Naur Form (ABNF) 定义. 此处未定义的规则 (具体包括 alphanum, fragment 和 pchar) 作为 URI syntax [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 内不经 percent-encoding 直接使用. 除这些组件内部之外, 对于 URN, 未紧跟 "=" 或 "+" 的 "?" 没有定义, URN-specific parser 和其他处理器 SHOULD 将其视为语法错误.

以下各节提供关于 URN 语法元素的更多信息.