java - 如何转义 URL 但保持 IPv6 地址周围的方括号不变

标签 java javascript

我有一个 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/

相关文章:

java - JSON Jackson 序列化反序列化列表列表

javascript - Angular Material 树 - 样式可能性

javascript - 将图像数据设置到图像src中

javascript - 从 Internet 加载特定网页时可以加载本地 CSS 文件吗?

java - Spring Boot应用程序未启动

java - 在java中循环通过scala ListBuffer

java - 现有的 Java 集合支持自定义唯一性标准吗?

java - Android 8.+ 上不显示前台服务通知

javascript - 如何在 Bootstrap Datepicker 中设置 maxViewMode (使用 JS Fiddle)

javascript - 如何使用按钮更改文本颜色