Я верю, что это делает то, что вы хотите.Это будет кодировать все, что не /
в пути, хотя.Возможно, это не самое элегантное решение, но оно должно быть безопасным для использования.
// make sure url is valid before parsing it
try {
new URL(url);
} catch (MalformedURLException e) {
return;
}
StringBuilder sb = new StringBuilder();
Scanner scanner = new Scanner(url).useDelimiter("/");
// append the protocol part, e.g. http://
sb.append(scanner.next());
sb.append('/');
// append the hostname part
sb.append(scanner.next());
sb.append('/');
// encode each part of path
while (scanner.hasNext()) {
String part = scanner.next();
sb.append(URLEncoder.encode(part, "UTF-8"));
sb.append('/');
}
// remove trailing slash if original doesn't have one
if (!url.endsWith("/")) {
sb.deleteCharAt(sb.length() - 1);
}
String encoded = sb.toString();