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);
Druckt
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
Was passiert hier?
1. Teilen Sie die URL in Strukturteile auf. Verwenden java.net.URL
Sie dafür.
2. Codieren Sie jedes Bauteil richtig!
3. Verwenden Sie Punycode, um den Hostnamen IDN.toASCII(putDomainNameHere)
zu codieren!
4. Verwenden Sie java.net.URI.toASCIIString()
, um NFC-codierten Unicode in Prozent zu codieren - (besser wäre NFKC!). Weitere Informationen finden Sie unter: So codieren Sie diese URL richtig
In einigen Fällen ist es ratsam zu überprüfen, ob die URL bereits verschlüsselt ist . Ersetzen Sie auch '+' codierte Leerzeichen durch '% 20' codierte Leerzeichen.
Hier sind einige Beispiele, die auch richtig funktionieren
{
"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$"
}
Die Lösung besteht rund 100 der von Web Plattform Tests bereitgestellten Testfälle .