问题区
我需要定义一个特定的路径段对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只定义到达服务器的URL的有效性(例如:输入URL栏)。
我实际上需要验证的是,未转义的路径段是否有效。继续上面的示例,/fo?o将是一个有效的资源,因为?是在未转义%3F时得到的。
这也意味着URL http://foo.com/first/sec%2fond将解析为两个未转义的路径段,/first和/sec/ond,后者不仅必须被看作是一个单个段,而不是两个单独的段,而且在语法上也是有效的(作为一个未转义的路径段)。
问题
编辑:正如迈克正确指出的,RFC3986淘汰了RFC2396。无论如何,我相信新的RFC比旧的RFC处理更多的情况(并且不会使某些路径段不合法),因此同样的问题也适用。
发布于 2011-03-30 17:10:48
我将以您所做的方式来解释该规范;也就是说,sec%2Fond是一个单一路径段。(但是--任何创建具有类似段的URI的人都应该受到严厉的惩罚!)
您要解决的问题是,非转义过程是lossey的;您不能从转义URI返回到未转义的String,然后返回原始的转义URI。这是无法避免的;在任何“有用”处理丢弃关键信息之前,您必须先获得转义URI。
有关处理非ASCII字符的详细信息,您可以阅读§2.1,但我的理解是,RFC 2396中的转义规则适用于URI字符串编码后的八进制字符串(字节)。字符编码的执行方式可以由该方案指定;没有通用方法。
发布于 2011-03-30 17:11:40
因此,例如,/foo是一个有效的路径段,但/fo?o不是因为非转义?要更正上面的示例,路径段应该写成/fo%3Fo。
对,是这样
这也意味着URL http://foo.com/first/sec%2fond将解析为两个未转义的路径段,/first和/sec/ond,后者不仅必须被视为一个单独的段,而不是两个单独的段,而且在语法上也是有效的(作为一个未转义的路径段)。
对,是这样。但是,有许多实现会导致这一错误。
U+00FF以上的字符如何,它们不能用于路径段吗?我以为他们得到了支持,至少在域名上是这样的。
URI转义(%十六进制)编码字节。不是代号。您需要知道URL的编码。例如,如果编码为UTF-8,则编码点U+1234被编码为%E1%88%B4.
域名中不允许转义的百分比。有关国际域名,请参见RFC 3492。
https://stackoverflow.com/questions/5489379
复制相似问题