documentation for java.net.URI
指定
对于任何URI,除了那些必须引用的字符之外,它们不会编码字符,以下标识也包含...
但做的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
。
附加说明:
new URI(test1.toString())
不是答案。也许答案是用字符串做所有事情并复制URI类在我自己的代码中解析和构造URI的能力,但这看起来很糟糕。 已更新以添加:
请注意,查询参数等存在同样的问题 - 它不仅仅是路径。
答案 0 :(得分:1)
我认为这个黑客会对你有用:
URI test1 = new URI("http://foo.bar.baz/example%E2%82%AC123");
URI test2 = new URI(test1.getScheme(),
test1.getUserInfo(),
test1.getHost(),
test1.getPort(),
test1.getPath(),
test1.getQuery(),
test1.getFragment());
test2 = new URI(test2.toASCIIString());
assert test1.equals(test2);
System.out.println(test1);
System.out.println(test2);
}
我使用toASCIIString()
进行了额外的步骤