Решение URLEncoder у меня не сработало, может быть потому, что оно кодирует только все. Я пытался использовать Apache HttpGet, и он выдает ошибку с URL-адресом в виде строки, закодированной таким образом.
Правильный путь в моем случае был такой странный код:
URL url = new URL(pageURLAsUnescapedString);
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), url.getQuery(), url.getRef());
Почему-то url.toURI не работает так же. Конструкторы URI работают двумя способами: если вы используете один с одним параметром String, конструктор делает вид, что предоставленный uri правильно экранирован (и, следовательно, ошибка, то же самое происходит с конструктором String HttpGet); если вы используете конструктор множественных строк URI, то класс очень хорошо обрабатывает все неэкранированные (а у HttpGet есть другой конструктор, принимающий URI). Почему URL.toURI () не делает этого? Понятия не имею ...
Надеюсь, это кому-нибудь поможет, у меня ушло несколько часов, чтобы понять это.