У меня была такая же проблема. На мой взгляд, лучшим решением является использование перегруженного конструктора для объекта URI и заполнение его получателями объекта URL. Таким образом, конструктор URI обрабатывает саму кодировку path-url и другие части (например, косые черты после протокола "http://") не будут затронуты.
uri = new URI(url.getProtocol(), url.getAuthority(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
Поля, которые не должны быть установлены, могут быть заполнены нулем.