为什么 RFC 3986(URI 通用语法)在语法规则显示“主机”组件区分大小写时却声明它不区分大小写?

问题描述 投票:0回答:1

首先,提醒未来的自己(图RFC 3986,第 3 节。语法组件补充有第 3.2 节。权威):

   The following are two example URIs and their component parts:

                 userinfo       host     port
                    |            |         |
                ____|______   ___|_____   _|
               /           \ /         \ /  \ 
         foo://user:[email protected]:8042/over/there?name=ferret#nose
         \_/   \____________________________/\_________/ \_________/ \__/
          |           |                          |            |        |
       scheme     authority        *----------- path        query   fragment
          |                        |
          |   _____________________|__
         / \ /                        \
         urn:example:animal:ferret:nose

第 3.2.2 节。 Host多次明确表示“主机”部分是不区分大小写

主机子组件不区分大小写。 [..] 虽然主机不区分大小写,但为了统一起见,生产者和标准化者应使用小写字母表示注册名称和十六进制地址,而仅使用大写字母表示百分比编码。

但语法规则也允许使用大写字母:

host        = IP-literal / IPv4address / reg-name
reg-name    = *( unreserved / pct-encoded / sub-delims )
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

参见第 2.3 节。未保留字符.


这背后的推理与稳健性原则有关吗? “方案”URI 组件(第 3.1 节。方案)似乎被定义为具有相同的模糊性,但它确实证明了它的合理性:

虽然方案不区分大小写,但规范形式是小写的,并且指定方案的文档必须使用小写字母。 实现应接受方案名称中的大写字母与小写字母相同(例如,允许“HTTP”和“http”)为了稳健性,但应仅生成小写方案名称以保持一致性

    scheme      = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

第 3.2.2 节。主持人没有明确说明这个理由,所以我认为这是隐含的?

url uri url-scheme
1个回答
0
投票

正如 Moshi 指出的,我混淆了“区分大小写”和“字母大小写”的概念:

“方案”组件和“主机”权限子组件都是“不区分大小写”的,这意味着它们可以包含任何大小写的字母,但实现应分别将“方案”和“主机”值视为相同,如果仅所包含字母的大小写不同。 (请参阅第 1.3 节语法符号

ALPHA
的定义。)

© www.soinside.com 2019 - 2024. All rights reserved.