Java.net.URI的文档指定:
这个方法失败了,因为
其他注意事项:
1. 不要问我为什么要保留理论上不需要转义的转义字符 - 相信我,你不想知道。 2. 实际上,我不想保留原始URL的所有内容,只想保留大部分内容 - 可能要替换主机、端口、协议,甚至路径的某些部分,所以
更新添加:
请注意,查询参数等也存在同样的问题 - 不仅是路径。
对于任何URI u,如果它...且不对除必须引用的字符之外的字符进行编码,则以下等式也成立...
那么对于需要编码但不需要引用的字符的URI呢?
URI test1 = new URI("http://foo.bar.baz/%E2%82%AC123");
URI test2 = new URI(test1.getScheme(), test1.getUserInfo(), test1.getHost(), test1.getPort(), test1.getPath(), test1.getQuery(), test1.getFragment());
assert test1.equals(test2); // blows up
这个方法失败了,因为
test2
的输出结果是http://foo.bar.baz/€123
,转义字符没有被转义。那么我的问题是:如何根据其组件构造与test1
相等的URI -- 保留转义字符?不能使用getRawPath()
代替getPath()
,因为这样转义字符本身会被转义,最终得到的是http://foo.bar.baz/%25E2%2582%25AC123
。其他注意事项:
1. 不要问我为什么要保留理论上不需要转义的转义字符 - 相信我,你不想知道。 2. 实际上,我不想保留原始URL的所有内容,只想保留大部分内容 - 可能要替换主机、端口、协议,甚至路径的某些部分,所以
new URI(test1.toString())
不是答案。也许答案是使用字符串完成所有操作,并在自己的代码中复制URI类解析和构造URI的能力,但这似乎很愚蠢。更新添加:
请注意,查询参数等也存在同样的问题 - 不仅是路径。