我需要生成href
一个 URI。除了需要百分比编码的保留字符之外,一切都很容易,例如链接/some/path;element
应该显示为<a href="/some/path%3Belement">
(我知道它path;element
代表单个实体)。
最初我正在寻找一个可以执行此操作的 Java 库,但我最终自己编写了一些东西(请看下面的 Java 失败的原因,因为这个问题不是 Java 特定的)。
因此,RFC 3986确实建议何时不编码。当我读到它时,当角色属于unreserved (ALPHA / DIGIT / "-" / "." / "_" / "~")
班级时,这应该发生。到现在为止还挺好。但是相反的情况呢?RFC 只提到百分比 ( %
) 总是需要编码。但是其他人呢?
问题:假设所有非保留的内容都可以/应该进行百分比编码是否正确?例如,左括号(
不一定需要编码,但分号需要;
。如果我不对其进行编码,我最终会在关注时寻找/first
* <a href="/first;second">
。但是,正如预期的那样,<a href="/first(second">
我总是最终会寻找。/first(second
让我感到困惑的是,就 RFC 而言,两者(
都;
属于同一sub-delims
类。正如我想象的那样,对所有非保留的内容进行编码是一个安全的选择,但是对于本地化 URI 而言,SEOability 和用户友好性又如何呢?
现在,Java 库失败了。我试过这样做,
new java.net.URI("http", "site", "/pa;th", null).toASCIISTring()
但这http://site/pa;th
并不好。观察到类似的结果:
javax.ws.rs.core.UriBuilder
- Spring的UriUtils - 我已经尝试
encodePath(String, String)
过encodePathSegment(String, String)
[*]是点击时在服务器端/first
调用的结果HttpServletRequest.getServletPath()
<a href="/first;second">
编辑:我可能需要提到这种行为是在 Tomcat 下观察到的,并且我检查了 Tomcat 6 和 7 的行为方式相同。