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()для кодування відсотків NICK, кодованого NFC - (краще було б NFKC!). Для отримання додаткової інформації див: Як правильно кодувати цю URL-адресу
У деяких випадках доцільно перевірити, чи URL-адреса вже закодовано . Також замініть кодовані пробіли "+" на "% 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$"
}
Рішення проходить близько 100 тестів, наданих веб-тестами платформи .