为什么下面的代码在运行时不会将URISyntaxException
作为非法URI抛出?
new URI("http:us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");
// or same with "http:// ... "
new URI("http://us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");
根据wikipedia“ /
”是保留的(特殊)字符,应将其百分比编码(也称为URL编码)为%2F
例如,如果保留字符
/
用于URI的“路径”组件,则其特殊含义是成为路径 之间的分隔符细分 。 如果,则根据给定的URI方案,/
必须位于路径段中,然后用三个字符%2F
或{必须在细分中使用{1}},而不是原始的%2f
。
但是URI构造函数不允许对其进行URL编码!
Wikipedia defines URI格式如下( RFC 3986 ,第3部分(2005年)):
/
并且URI构造函数允许在任何组件中直接使用URI = scheme:[//authority]path[?query][#fragment]
(未经百分比编码)(可能是方案的例外)。
URI Javadoc states:
此构造函数完全按照 RFC 2396,附录A,中的语法,除了以下差异: ...
凡是RFC 2396的地方,都允许使用other 类别中的字符 允许转义八位字节,即在用户信息,路径,查询, 和片段部分,以及授权部分(如果 权限是基于注册表的。这允许URI包含Unicode 超出US-ASCII字符集中的字符。
这允许使用非百分比编码的“其他”字符(请参见上面的Wiki链接以了解保留的/未保留的/其他字符的说明),例如ɷ(非ASCII),因此这与保留无关像正斜杠之类的字符。
但是无论如何-为什么以及为什么?
P.S。 Wikipedia解释了为什么我们可以在其他组件中使用正斜杠,但是为什么在路径组件(目录名,文件名)中仍可以使用正斜杠仍然不清楚。
在特定上下文中没有保留目的的保留字符也可以是百分比编码的,但在语义上与没有保留目的的字符没有区别。
在URI的“查询”组件中(?字符后的部分),用于 例如, /仍被视为保留字符 ,但通常 没有保留的目的,除非特定的URI方案说 否则。字符在字符时不需要进行百分比编码 没有保留的目的。
答案 0 :(得分:1)
好吧,所以问题实际上是为什么URI的path元素允许/。
在第一个Wikipedia注释中,您清楚地显示了/是路径段之间的分隔符。 (路径元素!=路径段)
您必须在其中路径段中转义。
您绝不能逃避 DELIMIT 路径段的
URI:http://address.com/path%2fSegment1/path%2fSegment2/path%2fSegment3