首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么URI构造函数允许在其URI参数中使用非百分号编码的保留特殊字符(正斜杠)?

为什么URI构造函数允许在其URI参数中使用非百分号编码的保留特殊字符(正斜杠)?
EN

Stack Overflow用户
提问于 2018-12-17 03:58:32
回答 1查看 130关注 0票数 1

为什么下面的代码没有在运行时将URISyntaxException作为非法URI抛出?

代码语言:javascript
复制
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)):

代码语言:javascript
复制
URI = scheme:[//authority]path[?query][#fragment]

URI构造器允许在任何组件中直接使用/ (不是百分比编码的)(可能是方案的例外)。

URI Javadoc states

这个构造函数完全按照RFC2396,附录A,中的语法来解析给定的字符串,除了以下偏差:...

other 类别中的字符在RFC2396允许转义八位字节的任何地方都被允许,即在用户信息、路径、查询和片段组件中,以及在授权组件中(如果授权是基于注册表的)。这允许URI包含超出US-ASCII字符集中的Unicode字符。

这允许非百分号编码的“其他”字符(参见上面的wiki链接了解保留/非保留/其他字符的说明),如ɷ(非ASCII码),所以这不是关于保留字符,如正斜杠。

但不管怎样-为什么?为什么?

另外,维基百科解释了为什么我们可以在其他组件中使用正斜杠,但为什么我们可以在路径组件(目录名、文件名)中使用它,这一点仍然不清楚。

在特定上下文中没有保留用途的

保留字符也可以是百分比编码的,但在语义上与那些没有编码的字符没有什么不同。在URI的"query“组件中(?字符),例如,/仍然被认为是保留字符,但是它通常没有保留目的,除非特定URI方案另有说明。当字符没有保留用途时,不需要对其进行百分比编码。

EN

回答 1

Stack Overflow用户

发布于 2018-12-17 07:05:43

好的,所以真正的问题是为什么URI的path元素允许/。

在维基百科的第一个注解中,您清楚地看到,/是路径段之间的分隔符。(路径元素!=路径段)

您必须转义路径段中的

您不能转义由分隔的路径段

URI:http://address.com/path%2fSegment1/path%2fSegment2/path%2fSegment3

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53805960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档