Кодировать (и перенаправлять) в URL, содержащий специальные символы в Java - PullRequest
1 голос
/ 28 марта 2011

У меня есть URL-адрес в объекте String, подобный этому:

http://bhorowitz.com/2011/03/24/bubble-trouble-i-don't-think-so/

URL может содержать или не содержать символы Юникода, которые необходимо кодировать. Например, указанную выше ссылку следует преобразовать в:

http://bhorowitz.com/2011/03/24/bubble-trouble-i-don%e2%80%99t-think-so/

прежде чем я перенаправлю на него.

Как правильно экранировать все специальные символы (например, юникод), сохраняя остальную часть структуры URL нетронутой? Уже есть что-то, что сделает это, или мне нужно накатить свою собственную?

Редактировать: сложная часть заключается в том, что мне нужно экранировать только недопустимые символы, оставляя оставшуюся часть URL без изменений (например, http: // должен оставаться http: // и не должен быть экранирован). URLEncoder, насколько я могу судить, не позволяет мне это делать.

Ответы [ 4 ]

1 голос
/ 04 апреля 2016

Я думаю, это то, что вы на самом деле искали:

new URL(yourURLString).toURI().toASCIIString();

Он будет кодировать только необходимые символы, оставляя все остальное без изменений.

1 голос
/ 28 марта 2011

JDK поставляется с достаточным количеством инструментов для обработки того, что вы хотите.Пожалуйста, ознакомьтесь с документацией: http://download.oracle.com/javase/6/docs/api/java/net/URLEncoder.html и http://download.oracle.com/javase/6/docs/api/java/net/URLDecoder.html

Использование довольно просто.

String decoded = URLDecoder.decode("url%20to%20decode", "UTF-8");
String encoded = URLEncoder.encode("url to decode", "UTF-8");

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

1 голос
/ 28 марта 2011
0 голосов
/ 28 марта 2011

Я верю, что это делает то, что вы хотите.Это будет кодировать все, что не / в пути, хотя.Возможно, это не самое элегантное решение, но оно должно быть безопасным для использования.

    // 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...