在Java中构建URI时保留转义字符

3
Java.net.URI的文档指定:

对于任何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的能力,但这似乎很愚蠢。
更新添加:
请注意,查询参数等也存在同样的问题 - 不仅是路径。
1个回答

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() 函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接