Как разобрать 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(); }