我有一个 URL,需要使用 Java 或 Javascript 进行百分比编码。
我无法提前知道 URL 是否包含协议(protocol)、端口或路径。我也不知道主机是名称、IPv4 地址还是 IPv6 地址。
此网址:
http://[fc00::90:90]/path/to/[file].txt
有两组方括号。第一个没问题,需要 IPv6 地址。但第二个应该是百分比转义的。所以转义后的URL应该是:
http://[fc00::90:90]/path/to/%5Bfile%5D.txt
如何转义第二对而不转义第一对?
我认为 URI.toASCIIString
是显而易见的解决方案,但它不喜欢文件名中的括号并抛出
java.net.URISyntaxException:索引 29 处的路径中存在非法字符:http://[fc00::90:90]/path/to/[file].txt
还有一个选项可以将 URL 解析为其组件并仅转义路径部分,但如果可能的话我宁愿不这样做。
有人可以建议使用 Java 或 Javascript 的解决方案吗? 谢谢。
最佳答案
我找到的解决此问题的最佳解决方案确实包括将 URL 解析为多个部分,但至少它是使用 java.net.URL
Java 库完成的。
java.net.URL
没有转义特殊字符的函数。 java.net.URI
确实具有此类功能,但不会接受 URL 路径中未转义的方括号。下面的方案结合了两者来解决问题:
URL url = new URL(urlString);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String escapedURL = uri.toString();
关于java - 如何转义 URL 但保持 IPv6 地址周围的方括号不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23780515/