Как разобрать URI, как это в Java - PullRequest
7 голосов
/ 01 декабря 2009

Я пытаюсь проанализировать следующий 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 ]

13 голосов
/ 01 декабря 2009

Символ канала "считается небезопасным" для использования в URL. Вы можете исправить это, заменив | с его закодированным шестнадцатеричным эквивалентом, который будет "% 7C"

Однако замена отдельных символов в URL-адресе - это хрупкое решение, которое не очень хорошо работает, если учесть, что в любом конкретном URL-адресе может быть довольно много разных символов, которые, возможно, потребуется заменить. Вы уже заменяете пробелы, каретки и трубы .... но как насчет скобок, знаков ударения и кавычек? Или вопросительные знаки и амперсанды, которые могут или не могут быть действительными частями URL, в зависимости от того, как они используются?

Таким образом, лучшим решением будет использование возможности языка для кодирования URL-адресов, а не ручная работа. В случае Java используйте URLEncoder , как в примере с ответом BalusC на этот вопрос.

12 голосов
/ 10 февраля 2011

Решение URLEncoder у меня не сработало, может быть потому, что оно кодирует только все. Я пытался использовать Apache HttpGet, и он выдает ошибку с URL-адресом в виде строки, закодированной таким образом.

Правильный путь в моем случае был такой странный код:

URL url = new URL(pageURLAsUnescapedString);
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), url.getQuery(), url.getRef());

Почему-то url.toURI не работает так же. Конструкторы URI работают двумя способами: если вы используете один с одним параметром String, конструктор делает вид, что предоставленный uri правильно экранирован (и, следовательно, ошибка, то же самое происходит с конструктором String HttpGet); если вы используете конструктор множественных строк URI, то класс очень хорошо обрабатывает все неэкранированные (а у HttpGet есть другой конструктор, принимающий URI). Почему URL.toURI () не делает этого? Понятия не имею ...

Надеюсь, это кому-нибудь поможет, у меня ушло несколько часов, чтобы понять это.

7 голосов
/ 01 декабря 2009

Разве вам не лучше использовать URLEncoder , чем выборочное кодирование?

6 голосов
/ 01 декабря 2009

Вы должны использовать java.net.URLEncoder для URL-кодирования запроса с помощью UTF-8. Вам не обязательно нужно регулярное выражение для этого. Вы не хотите иметь регулярное выражение, чтобы покрыть все эти тысячи китайских глифов, не так ли? ;)

String query = URLEncoder.encode("zh-CN|en|你", "UTF-8");
String url = "http://translate.google.com/#" + query;
Desktop.getDesktop().browse(new URI(url));    
3 голосов
/ 09 марта 2014

Принимая лучшее из ответа Федерико и ответа Марека , вам необходимо сделать следующее:

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);
0 голосов
/ 16 февраля 2016

Сначала закодируйте ваш 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); * +1004 *

public static void displayFileOrUrlInBrowser(String File_Or_Url)
  {
    try { Desktop.getDesktop().browse(File_Or_Url); }
    catch (Exception e) { e.printStackTrace(); }
  }
0 голосов
/ 01 декабря 2009

Хорошо, я нашел, как это сделать, вот так:

try { Desktop.getDesktop().browse(new URI(File_Or_Url.replace(" ","%20").replace("^","%5E").replace("|","%7C"))); }
catch (Exception e) { e.printStackTrace(); }
...