URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);
打印
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
这里发生了什么?
1. 将 URL 拆分为结构部分。使用java.net.URL。
2.正确编码每个结构部分!
3. 使用IDN.toASCII(putDomainNameHere) 到Punycode 编码主机名!
4. 使用java.net.URI.toASCIIString() 进行百分比编码,NFC 编码的 unicode -(最好是 NFKC!)。欲了解更多信息,请参阅:How to encode properly this URL
在某些情况下,建议使用check if the url is already encoded。还要用 '%20' 编码空格替换 '+' 编码空格。
以下是一些也可以正常工作的示例
{
"in" : "http://نامهای.com/",
"out" : "http://xn--mgba3gch31f.com/"
},{
"in" : "http://www.example.com/‥/foo",
"out" : "http://www.example.com/%E2%80%A5/foo"
},{
"in" : "http://search.barnesandnoble.com/booksearch/first book.pdf",
"out" : "http://search.barnesandnoble.com/booksearch/first%20book.pdf"
}, {
"in" : "http://example.com/query?q=random word £500 bank $",
"out" : "http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$"
}
该解决方案通过了Web Plattform Tests 提供的大约 100 个测试用例。