跳到主要内容

3. URN-Equivalence

3.1. 过程​

出于缓存等各种目的, 常常需要判断两个 URN 是否 "相同". 最一般地 (即独立于方案地) 做到这一点的方法就是测试等价性 (见 [RFC3986] 第 6.1 节).

通用 URI 规范 [RFC3986] 对相等性比较非常灵活, 其重点在于允许假阴性并避免假阳性. 如果以独立于方案的方式 (即仅作为 URI 比较) 进行比较, 那么许多本规范认为相等的 URN 都会被判为不相等. 以下讨论适用于所涉及的 URI 已知为 URN 的情形, 因此使用术语 "URN-equivalent" 和 "URN-equivalence" 来指本文档所规定的等价性.

如果两个 URN 的 assigned-name 部分在对以下构造应用大小写规范化 (如 [RFC3986] 第 6.2.2.1 节所规定) 之后逐八位组相等, 则这两个 URN 是 URN-equivalent 的:

  1. URI 方案 "urn", 通过转换为小写

  2. NID, 通过转换为小写

  3. NSS 中的任何百分号编码字符 (即所有匹配基础 URI 规范 [RFC3986] 第 2.1 节中 <pct-encoding> 产生式的字符三元组), 通过把数字 A-F 转换为大写.

禁止 (MUST NOT) 对百分号编码字符进行解码, 也就是说, 禁止 (MUST NOT) 把百分号编码规范化 (如 [RFC3986] 第 6.2.2.2 节所规定) 作为比较过程的一部分加以应用.

如果某个 URN 中包含 r-component, q-component 或 f-component (或它们的任意组合), 则在确定 URN-Equivalence 时必须 (MUST) 忽略它.

URN 命名空间定义可以 (MAY) 包含针对 URN-Equivalence 的附加规则, 例如 NSS (或其部分) 的大小写不敏感. 此类规则必须 (MUST) 始终具有消除上述过程所产生的一部分假阴性的效果, 并且如果本文的过程判定两个 URN 是 URN-equivalent 的, 那么此类规则禁止 (MUST NOT) 导致把这两个 URN 视为不 "相同". 关于与 NID 注册相关的考虑, 见下文.

3.2. 示例​

本节展示各种 URN (使用 [RFC6963] 中定义的 "example" NID), 以突出说明 URN-Equivalence 规则.

第一, 由于方案和 NID 大小写不敏感, 以下三个 URN 彼此 URN-equivalent:

  • urn:example:a123,z456

  • URN:example:a123,z456

  • urn:EXAMPLE:a123,z456

第二, 由于在测试 URN-Equivalence 时不考虑 r-component, q-component 和 f-component, 以下三个 URN 与上面前三个例子 URN-equivalent:

  • urn:example:a123,z456?+abc

  • urn:example:a123,z456?=xyz

  • urn:example:a123,z456#789

第三, 由于在 URN-Equivalence 中会考虑 NSS 中的 "/" 字符 (以及紧随其后的任何内容), 以下 URN 彼此之间以及与前面六个 URN 都不 URN-equivalent:

  • urn:example:a123,z456/foo

  • urn:example:a123,z456/bar

  • urn:example:a123,z456/baz

第四, 由于百分号编码的原因, 以下 URN 仅彼此 URN-equivalent, 而与上面任何一个都不等价 (请注意, 尽管 %2C 是前面例子中 "," 的百分号编码变换形式, 但为测试 URN-Equivalence 起见, 此类序列不会被解码):

  • urn:example:a123%2Cz456

  • URN:EXAMPLE:a123%2cz456

第五, 由于 NSS 中除百分号编码序列之外的字符按大小写敏感的方式处理 (除非对所涉及的 URN 命名空间另有规定), 以下 URN 与前三个 URN 不 URN-equivalent:

  • urn:example:A123,z456

  • urn:example:a123,Z456

第六, 在面向人的界面中呈现某个 URN 时, 随意目视检查可能会觉得以下 URN 与前三个 URN 看起来相同 (因为 U+0430 CYRILLIC SMALL LETTER A 可能与 U+0061 LATIN SMALL LETTER A 混淆), 但它与前三个 URN 并不 URN-equivalent:

  • urn:example:%D0%B0123,z456