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

标签 java url uri url-encoding

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.

补充说明:

  1. 不要问我为什么需要保留理论上不需要转义的转义字符——相信我,你不想知道。
  2. 实际上我不想保留所有原始 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/

相关文章:

java - hibernate spring jpa中的双向一对一

Android:从 url 获取 'title' 而无需获取整个页面

Android-如何将 android.net.Uri 对象转换为 java.net.URI 对象?

html - 使用 `javascript:` 伪协议(protocol)的 URL 编码规则?

java - 将 jasper 报告导出为 pdf 时出错

java - 从 iPhone 更新 Google App Engine 中的数据存储

java - 在Java中压缩/解压缩LZMA字符串

php - 通过 PHP 更改 URL

javascript - 无法使用 GET 方法获取个人资料页面?

android - ContentUris.withAppendedId中 '_id'有什么用