java.net.URLEncoder.encode (String) устарел, что я должен использовать вместо этого?

192

Я получаю следующее предупреждение при использовании java.net.URLEncoder.encode:

предупреждение: [не рекомендуется] кодировать (java.lang.String)
         в java.net.URLEncoder устарел

Что я должен использовать вместо этого?

Фрэнк Крюгер
источник
23
На это есть ответ в теге устаревания в документах: «Вместо этого используйте метод encode (String, String) для указания кодировки». См. Java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Майкл Майерс

Ответы:

278

Используйте другой encodeметод в URLEncoder :

URLEncoder.encode(String, String)

Первый параметр - это текст для кодирования; вторая - имя используемой кодировки символов (например, UTF-8). Например:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Уилл Вагнер
источник
14
@jsh: я запутался, почему не должно быть URLDecoder? Почему это делает Java раздутым? Это статические методы. Это займет столько же усилий, чтобы набрать либо. Если вам нравится Python, почему вы программируете на Java? Это потому, что больше людей используют Java, чем Python, и вы получили работу на Java вместо Python?
Степанян
10
Он называет это раздутым, потому что оно перенасыщает глобальное пространство имен классов. Зачем нужны URLEncoder.encode и URLDecoder.decode, когда у вас могут быть URL.encode и URL.decode или даже просто URLEncoder.decode? Зачем делать все это избыточным и распухшим? Потому что это Java.
BT
30
И затем вам нужно обработать исключение UnsupportedEncodingException, хотя UTF-8 должен поддерживаться практически везде.
Дейв Кэмерон
8
@tc .: Java 7 ввел эти константы: StandardCharsets.US_ASCIIи StandardCharsets.UTF_8т. д. К сожалению, URLEncoder.encodeне принимает Charset... (но многие другие методы принимают).
слеське
12
Незначительное предложение - использовать URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Используя константу статического UTF_8«ы toString()метода в качестве схемы кодировки символов бросает java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]как toString()возвращает„java.nio.charset.CharsetICU [UTF-8]“. Чтобы получить желаемый «UTF-8», используйте name()вместо этого его метод.
et_l
31

Вы должны использовать:

URLEncoder.encode("NAME", "UTF-8");
Атул Дарне
источник
24

Используйте класс URLEncoder :

URLEncoder.encode(String s, String enc)

Куда :

s - Строка для перевода.

enc - Имя поддерживаемой кодировки символов .

Стандартные кодировки:

US-ASCII Семибитовый ASCII, он же ISO646-US, он же базовый латинский блок набора символов Unicode, ISO-8859-1 ISO, латинский алфавит № 1, он же ISO-LATIN-1.

UTF-8 Восьмибитный формат преобразования UCS

UTF-16BE 16-битный формат преобразования UCS, порядок байтов с прямым порядком байтов

UTF-16LE 16-битный формат преобразования UCS, порядок байтов с прямым порядком байтов

UTF-16 16-битный формат преобразования UCS, порядок байтов, идентифицируемый необязательной меткой порядка байтов

Пример:

import java.net.URLEncoder;

String stringEncoded = URLEncoder.encode(
    "This text must be encoded! aeiou áéíóú ñ, peace!", "UTF-8");
Jorgesys
источник
1

Первый параметр - это String для кодирования; второе - имя используемой кодировки символов (например, UTF-8).

user3591718
источник
0

В качестве дополнительной ссылки для других ответов вместо использования «UTF-8» вы можете использовать:

HTTP.UTF_8

которая включена с Java 4 как часть библиотеки org.apache.http.protocol, которая включена также с Android API 1.

htafoya
источник
Неправильно , этот класс находится в Apache HttpClient 4.x библиотеки org.apache.http.protocol.HTTPклассов.
Бухаке Синди
@BuhakeSindi правда, я читал API 1, но это был Android, а не Java, так или иначе, он существует до Java 7, он даже устарел, хаха.
Хтафоя
нет, этот класс никогда не существовал ни в одной версии Java JDK. Android следует библиотеке Apache HttpClient (я не удивлюсь, если они также взяли исходный код оттуда).
Бухаке Синди
3
предупреждение: [устаревшее] UTF_8 в HTTP устарело .
sgtdck
0

Использование org.apache.commons.httpclient.URIне является строго проблемой; проблема в том, что вы нацелены не на тот конструктор, который не рекомендуется.

Используя только

new URI( [string] );

Будет действительно помечать это как обесцененное. Необходимо предоставить как минимум один дополнительный аргумент (первый, ниже), а в идеале два:

  1. escaped: true, если последовательность символов URI находится в экранированной форме. ложь в противном случае.
  2. charset: строка charset для экранирования, если требуется

Это будет предназначаться для недооцененного конструктора в пределах этого класса. Таким образом, идеальное использование будет таким:

new URI( [string], true, StandardCharsets.UTF_8.toString() );

Немного сумасшедший - поздно в игре (более чем 11 лет спустя - egad! ), Но я надеюсь, что это поможет кому-то еще, особенно если метод в дальнем конце все еще ожидает URI, такой как org.apache.commons.httpclient.setURI().

Р. Кабис
источник