我需要生成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 的行为方式相同。