Чтобы быть точным, рассмотрим следующий пример строки:
String str = ":Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism";
java.net.URI(str).getPath();
Здесь, поскольку str содержит двоеточие :, URI().getPath() возвращает ноль, но если я удалю двоеточие, возвращаемое значение будет таким, как я ожидал.
Итак, как мне заставить URI().getPath() не фильтровать двоеточие и оставить его как есть?




Вы можете попытаться «уйти» от символа двоеточия следующим образом (используя URLEncoder, как предлагает Страшный вомбат):
import java.net.*;
import java.io.*;
public class MyClass {
public static void main(String args[]) {
try {
String str = "https://www.jdoodle.com/online-ja:va-compiler";
String escapedStr = URLEncoder.encode(str, "UTF-8");
System.out.println(escapedStr);
String uriPath = new java.net.URI(escapedStr).getPath();
System.out.println(uriPath);
} catch (URISyntaxException | UnsupportedEncodingException e) {
e.printStackTrace(); // just for the sake of this example, this should be logged properly
}
}
}
И вывод:
https%3A%2F%2Fwww.jdoodle.com%2Fonline-ja%3Ava-compiler // note the UTF-8 representation for potentially problematic characters
https://www.jdoodle.com/online-ja:va-compiler
Первоначально предложенный подход заключается в использовании концепции замены подстроки как ускользания от проблемных символов (в зависимости от бизнес-логики вашего кода) - обратите внимание, что это общий подход, который не подходит для обработки URI:
public class Escaping {
private static final String COLON = ":";
private static final String ESCAPE_COLON = ".colon.";
public static void main(String args[]) {
String str = "This is my : String : with colons";
String escapedStr = str.replaceAll(COLON,ESCAPE_COLON);
System.out.println(escapedStr);
// perfrom whatever action you need with the 'problematic' colon characters
// ...
// ...
System.out.println(escapedStr.replaceAll(ESCAPE_COLON,COLON));
}
}
И вывод:
This is my .colon. String .colon. with colons
This is my : String : with:
Рекомендации:
хотя ваш ответ сработал, но что, если мой str содержал .colon., тогда это было бы недостатком, верно?
.colon. был выбран для этого примера произвольно. Вы можете заменить его на все, что пожелаете. ..colon.. тоже может подойти. Если мой ответ был полезен - рассмотрите возможность голосования или выбора его в качестве ответа на свой вопрос. Спасибо за внимание.
Прежде всего, немного о вашем коде. Он не компилируется, потому что вам нужно использовать new для создания нового объекта:
String str = ":Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism";
new java.net.URI(str).getPath();
Этот код не возвращает null - вместо этого он выдает описательное исключение:
java.net.URISyntaxException: Expected scheme name at index 0: :Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism
Конструктор URI принимает полный URI, а двоеточие имеет особое значение, но перед ним должен стоять префикс с именем протокола, например http: или file:.
Если вы хотите использовать эти специальные символы внутри пути, вам необходимо URL-кодировать путь - это нормальная практика для включения специальных символов в URL или URI:
String str = ":Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism";
str = URLEncoder.encode(str, "UTF-8"); // <---- URL encoding
System.out.println(new java.net.URI(str).getPath());
Вам не нужно придумывать собственную схему кодирования с собственными заменами - URL-адрес является стандартом. И вам также не нужно декодировать, это автоматически выполняется getPath().
Однако в вашем случае ваш путь уже частично закодирован по URL-адресу и уже содержит двоеточие: Royal+weddings:+ceremony+The+symbolism.
Вам нужно URL-кодировать весь путь за один раз:
String encoded = URLEncoder.encode(":Royal+weddings:+ceremony+The+symbolism", "UTF-8");
Тогда вы устроились.
URI (). GetPath ()
Returns the decoded path component of this URI.. Если действительный путь не может быть декодирован, вы получите нулевое значение.