Der Code
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);
Drucke
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
Was ist hier los?
1. URL in strukturelle Teile aufteilen. Verwenden Sie java.net.URL
für sie.
2. Codieren Sie jedes Strukturteil richtig!
3. Verwenden Sie IDN.toASCII(putDomainNameHere)
a Punycode den Hostnamen verschlüsseln!
4. Verwenden Sie java.net.URI.toASCIIString()
a Prozent-Codierung NFC kodierter Unicode - (besser wäre NFKC!). Für weitere Informationen, siehe: Wie kodiere ich diese URL richtig?
In einigen Fällen ist es ratsam prüfen, ob die URL bereits kodiert ist . Ersetzen Sie auch '+'-kodierte Leerzeichen durch '%20'-kodierte 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 etwa 100 der Testfälle, die von Web-Plattform-Tests .