Как разобрать URI, как это в Java
Я пытаюсь разобрать следующий URI:http://translate.google.com/#zh-CN/en/你
, но получил это сообщение об ошибке :
java.net.URISyntaxException: Illegal character in fragment at index 34: http://translate.google.com/#zh-CN|en|你
at java.net.URI$Parser.fail(URI.java:2809)
at java.net.URI$Parser.checkChars(URI.java:2982)
at java.net.URI$Parser.parse(URI.java:3028)
у него проблема с символом"|", если я избавлюсь от"|", последний китайский символ не вызывает никаких проблем, каков правильный способ справиться с этим ?
мой метод выглядит так :
public static void displayFileOrUrlInBrowser(String File_Or_Url)
{
try { Desktop.getDesktop().browse(new URI(File_Or_Url.replace(" ","%20").replace("^","%5E"))); }
catch (Exception e) { e.printStackTrace(); }
}
Спасибо за ответы, но решение BalusC, похоже, работает только для экземпляра url, мой метод должен работать с любым url, который я передаю ему, как он узнает, где начальная точка, чтобы разрезать url на две части и кодировать только вторую часть ?
7 ответов
знака "считаются небезопасными" для использования в URL. Вы можете исправить это, заменив | на его закодированный шестнадцатеричный эквивалент, который будет "%7C"
однако замена отдельных символов в URL-адресе является хрупким решением, которое не работает очень хорошо, если учесть, что в любом данном URL-адресе потенциально может быть довольно много разных символов, которые могут потребоваться заменить. Вы уже заменяете пробелы, каретки и трубы.... но что о скобках, ударениях и кавычках? Или вопросительные знаки и амперсанды, которые могут быть или не быть допустимыми частями URL-адреса, в зависимости от того, как они используются?
таким образом, лучшим решением было бы использовать средство языка для кодирования URL-адресов, а не делать это вручную. В случае Java используйте средств кодирования, в соответствии с примером в ответе BalusC на этот вопрос.
решение URLEncoder не сработало для меня, возможно, потому, что оно кодирует все. Я пытался использовать HttpGet apache, и он выдает ошибку с url-адресом в виде строки, закодированной таким образом.
правильный путь в моем случае был этот странный код:
URL url = new URL(pageURLAsUnescapedString);
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), url.getQuery(), url.getRef());
почему-то URL-адрес.тури работает по-другому. Конструкторы URI работают двумя способами: Если вы используете один с одним строковым параметром, конструктор делает вид, что предоставленный uri правильно экранирован (и, таким образом, ошибка, то же самое происходит со строковым конструктором HttpGet); если вы используете конструктор URI нескольких строк, то класс обрабатывает все без эскапады очень хорошо (и HttpGet имеет другой конструктор, принимающий URI). Почему URL-адрес.toURI () не делает этого? Понятия не имею...
надеюсь, это кому-то поможет, мне потребовалось несколько часов, чтобы понять это.
не лучше ли вам использовать средств кодирования чем выборочно кодировать материал?
вы должны использовать java.net.URLEncoder
to URL-кодировать запрос с помощью UTF-8
. Вам не обязательно нужно regex для этого. Вы же не хотите иметь регулярное выражение, чтобы покрыть все эти тысячи китайских иероглифов, не так ли? ;)
String query = URLEncoder.encode("zh-CN|en|你", "UTF-8");
String url = "http://translate.google.com/#" + query;
Desktop.getDesktop().browse(new URI(url));
взяв лучшее из ответ Федерико и Марек!--3-->, вам нужно сделать следующее:
URL url = new URL(pageURLAsUnescapedString);
// URI's constructor expects the path, query string and fragment to be decoded.
// If we do not decode them, we will end up with double-encoding.
String path = url.getPath();
if (path != null)
path = URLDecoder.decode(path, "UTF-8");
String query = url.getQuery();
if (query != null)
query = URLDecoder.decode(query, "UTF-8");
String fragment = url.getRef();
if (fragment != null)
fragment = URLDecoder.decode(fragment, "UTF-8");
URI uri = new URI(url.getProtocol(), url.getAuthority(), path, query, fragment);
сначала Закодируйте свой URL, пожалуйста, используйте следующий пример, затем передайте URL в метод
JSONObject json = new JSONObject();
json.put("name", "vaquar");
json.put("age", "30");
json.put("address", "asasbsa bajsb ");
System.out.println("in sslRestClientGETRankColl"+json.toString());
String createdJson=json.toString();
createdJson= URLEncoder.encode(createdJson, "UTF-8");
/ / метод вызова сейчас displayFileOrUrlInBrowser (createdJson);
public static void displayFileOrUrlInBrowser(String File_Or_Url)
{
try { Desktop.getDesktop().browse(File_Or_Url); }
catch (Exception e) { e.printStackTrace(); }
}
хорошо, я нашел, как это сделать, вот так:
try { Desktop.getDesktop().browse(new URI(File_Or_Url.replace(" ","%20").replace("^","%5E").replace("|","%7C"))); }
catch (Exception e) { e.printStackTrace(); }