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

时间:2014-05-21 10:26:48

标签: java javascript

我有一个URL,我需要使用Java或Javascript进行百分比编码。

我无法提前知道URL是否包括协议,端口或路径。此外,我无法知道主机是名称,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: Illegal character in path at index 29: http://[fc00::90:90]/path/to/[file].txt

还有一个选项可以将URL解析为其组件并仅转义路径部分,但如果可能的话,我不想这样做。

有人可以建议使用Java或Javascript的解决方案吗? 感谢。

2 个答案:

答案 0 :(得分:2)

我发现这个问题的最佳解决方案包括解析部分的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();

答案 1 :(得分:0)

您无法使用一个函数对整个网址进行编码。 网址的每个部分都允许不同的字符,因此必须单独编码。

因此,在您的情况下,您应首先parse the url using java.net.URL,然后相应地对每个部分进行编码,例如使用UriComponentsBuilder

您还可以使用java.net.URI进行编码,该编码也会分别对每个部分进行编码,但请务必使用toASCIIString()将正确编码的网址作为字符串。