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()
для кодирования в процентах, кодированный в NFC Unicode - (лучше было бы 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 тестовых случаев, предоставленных Web Plattform Tests .