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 тестів, наданих веб-тестами платформи .