我需要定义特定的路径段是否对RFC2396有效。规范说:
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
escaped = "%" hex hex
hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
"a" | "b" | "c" | "d" | "e" | "f"
因此,例如,/foo
是有效的路径段,但/fo?o
不是因为未转义的?
。要更正上述示例,路径段应写为/fo%3Fo
。
Spec仅定义了到达服务器的URI的有效性(想想:在URL栏中输入)。
我实际需要验证的是未转义路径段是否有效。继续上面的示例,/fo?o
将是一个有效的资源,因为?
是您在取消%3F
时获得的。
这也意味着网址http://foo.com/first/sec%2fond
将解析为两个未转义的路径段/first
和/sec/ond
,而后者不仅必须被视为单个段而不是两个单独的段,但在语法上也是有效的(作为未转义的路径段)。
答案 0 :(得分:2)
我会以同样的方式解释规范;也就是说,sec%2Fond
是单个路径段。 (但是 - 任何使用类似段创建URI的人都应该受到严厉惩罚!)
你正在努力解决的问题是,逃避的过程是失败的;您无法从转义的URI转发到未转义的String
并返回原始的转义URI。没有办法解决这个问题;在任何“有用的”处理丢弃该关键信息之前,您必须掌握转义的URI。
有关处理非ASCII字符的详细信息,请参阅§2.1,但我的理解是RFC 2396中的转义规则适用于 URI字符串后的八位字符串(字节)已经进行了字符编码。如何执行字符编码可以由方案指定;没有通用的方法。
答案 1 :(得分:2)
因此,例如,/ foo是一个有效的路径段,但/ fo?o不是因为非转义?要纠正上面的示例,路径段应写为/ fo%3Fo。
正确
这也意味着URL http://foo.com/first/sec%2fond将解析为两个未转义的路径段,/ first和/ sec / ond,而后者不仅必须被视为单个段而不是两个独立的段,而是语法上也有效(作为未转义的路径段)。
正确。但是有很多实现都会出错。
U + 00FF以上的字符怎么样,它们不能用在路径段中吗?我认为他们得到了支持,至少在域名中是这样。
URI转义(%hex hex)编码字节。不是代码点。您需要知道URL的编码。例如,如果编码为UTF-8,则代码点U + 1234编码为%E1%88%B4
。
域名中不允许出现百分比转义。对于国际域名,请参阅RFC 3492。