Декодирование URL в Java 6

Я вижу, что java.net.URLDecoder.decode(String) устарел в 6.

У меня есть следующая строка:

String url ="http://172.20.4.60/jsfweb/cat/%D7%9C%D7%97%D7%9E%D7%99%D7%9D_%D7%A8%D7%92%D7%99%D7%9C%D7%99%D7%9"

Как его декодировать в Java 6?

Ответ 1

Теперь вам нужно указать кодировку символов вашей строки. Исходя из информации на странице URLDecoder:

Примечание: Консорциум World Wide Web В Рекомендации говорится, что UTF-8 должен быть использован. Не делать этого может ввести несовместимости.

Для вас должно работать следующее:

java.net.URLDecoder.decode(url, "UTF-8");

Забастовкa >

См. ответ Draemon ниже.

Ответ 2

Вы должны использовать java.net.URI, так как класс URLDecoder делает декодирование x-www-form-urlencoded, которое неверно (несмотря на имя, оно для данных формы).

Ответ 3

Как упоминаемая документация, decode(String) устарела, потому что она всегда использует кодировку по умолчанию для платформы, что часто бывает неправильным.

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

Ответ 4

Только метод decode(String) устарел. Вы должны использовать метод decode(String, String) для явного задания кодировки символов для декодирования.

Ответ 5

Как отмечалось в предыдущих плакатах, для этого нужно использовать класс java.net.URI:

System.out.println(String.format("Decoded URI: '%s'", new URI(url).getPath()));

Я хочу дополнительно отметить, что если у вас есть фрагмент пути URI и вы хотите его декодировать отдельно, тот же подход с конструктором с одним аргументом работает, но если вы попытаетесь использовать конструктор с четырьмя аргументами это не:

String fileName = "Map%20of%20All%20projects.pdf";
URI uri = new URI(null, null, fileName, null);
System.out.println(String.format("Not decoded URI *WTF?!?*: '%s'", uri.getPath()));

Это было протестировано в Oracle JDK 7. Тот факт, что это не работает, является интуитивно понятным, противоречит JavaDocs и, вероятно, считается ошибкой.

Он может отключать людей, которые пытаются использовать подход, симметричный для кодирования. Как отмечено в этом сообщении: "как кодировать URL-адрес, чтобы избежать специальных символов в java", чтобы закодировать URI, это хорошая идея построить URI, передавая разные части URI отдельно, поскольку разные правила кодирования применяются к различным частям:

String fileName2 = "Map of All projects.pdf";
URI uri2 = new URI(null, null, fileName2, null);
System.out.println(String.format("Encoded URI: '%s'", uri2.toASCIIString()));