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);
stampe
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
Cosa sta succedendo qui?
1. Suddividere l'URL in parti strutturali. Usalo java.net.URL
per questo.
2. Codificare correttamente ogni parte strutturale!
3. Utilizzare IDN.toASCII(putDomainNameHere)
per Punycode codificare il nome host!
4. Usare java.net.URI.toASCIIString()
per codificare in percentuale, Unicode con codifica NFC - (meglio sarebbe NFKC!). Per maggiori informazioni vedi: Come codificare correttamente questo URL
In alcuni casi è consigliabile verificare se l'URL è già codificato . Sostituisci anche gli spazi codificati '+' con spazi codificati '% 20'.
Ecco alcuni esempi che funzioneranno correttamente
{
"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$"
}
La soluzione supera circa 100 testcase forniti da Web Plattform Test .