documentation for java.net.URI
指定
For any URI u that ... and that does not encode characters except those that must be quoted, the following identities also hold...
但是 对不需要引号的字符进行编码的 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
.
补充说明:
- 不要问我为什么需要保留理论上不需要转义的转义字符——相信我,你不想知道。
- 实际上我不想保留所有原始 URL,只是其中的大部分——可能会替换主机、端口、协议(protocol),甚至部分路径,所以
new URI(test1.toString( ))
不是答案。也许答案是用字符串做所有事情并复制 URI 类在我自己的代码中解析和构造 URI 的能力,但这似乎很愚蠢。
更新添加:
请注意,查询参数等也存在同样的问题——不仅仅是路径。
最佳答案
我认为这个 hack 对你有用:
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()
关于java - 在 Java 中构造 URI 时保留转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7841001/