为什么下面的代码没有在运行时将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的“
”部分中使用保留字符
/
,则它具有作为path 段之间的分隔符的特殊含义。如果根据给定的URI方案,/
%2f
需要在路径段,中,则必须在该段中使用三个字符的%2f
/
.或%2f
,而不是原始的<>e227>
但是URI构造函数不允许对其进行URL编码!
维基百科RFC格式如下( defines 3986,第3节(2005)):
URI = scheme:[//authority]path[?query][#fragment]
URI构造器允许在任何组件中直接使用/
(不是百分比编码的)(可能是方案的例外)。
URI Javadoc states
这个构造函数完全按照RFC2396,附录A,中的语法来解析给定的字符串,除了以下偏差:...
other 类别中的字符在RFC2396允许转义八位字节的任何地方都被允许,即在用户信息、路径、查询和片段组件中,以及在授权组件中(如果授权是基于注册表的)。这允许URI包含超出US-ASCII字符集中的Unicode字符。
这允许非百分号编码的“其他”字符(参见上面的wiki链接了解保留/非保留/其他字符的说明),如ɷ(非ASCII码),所以这不是关于保留字符,如正斜杠。
但不管怎样-为什么?为什么?
另外,维基百科解释了为什么我们可以在其他组件中使用正斜杠,但为什么我们可以在路径组件(目录名、文件名)中使用它,这一点仍然不清楚。
在特定上下文中没有保留用途的
保留字符也可以是百分比编码的,但在语义上与那些没有编码的字符没有什么不同。在URI的"query“组件中(?字符),例如,/仍然被认为是保留字符,但是它通常没有保留目的,除非特定URI方案另有说明。当字符没有保留用途时,不需要对其进行百分比编码。
发布于 2018-12-17 07:05:43
好的,所以真正的问题是为什么URI的path元素允许/。
在维基百科的第一个注解中,您清楚地看到,/是路径段之间的分隔符。(路径元素!=路径段)
您必须转义路径段中的。
您不能转义由分隔的路径段
URI:http://address.com/path%2fSegment1/path%2fSegment2/path%2fSegment3
https://stackoverflow.com/questions/53805960
复制相似问题