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

时间:2011-10-20 19:12:16

标签: java url uri url-encoding

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

附加说明:

  1. 不要问为什么我需要保留理论上不需要逃脱的逃脱角色 - 相信我,你不想知道。
  2. 实际上我不想保留所有原始URL,只是大部分内容 - 可能会替换主机,端口,协议甚至部分路径,因此new URI(test1.toString())不是答案。也许答案是用字符串做所有事情并复制URI类在我自己的代码中解析和构造URI的能力,但这看起来很糟糕。
  3. 已更新以添加:

    请注意,查询参数等存在同样的问题 - 它不仅仅是路径。

1 个答案:

答案 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()

进行了额外的步骤