我有一个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的解决方案吗? 感谢。
答案 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()
将正确编码的网址作为字符串。