java.net.URLEncoder.encode (String) застарілий, що я повинен використовувати замість цього?


192

При використанні я отримую таке попередження java.net.URLEncoder.encode :

попередження: [deprecation] кодування (java.lang.String)
         у java.net.URLEкодер застарілий

Що я повинен використовувати замість цього?


23
На це відповідає тег депресації в документах: "Замість цього використовуйте метод кодування (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? Чому це робить Яву роздутою? Це статичні методи. Для введення знадобиться стільки ж зусиль. Якщо вам подобається 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... (але багато інших методів).
sleske

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


24

Використовуйте клас URLEncoder :

URLEncoder.encode(String s, String enc)

Де:

s - Рядок для перекладу.

enc - ім'я підтримуваного кодування символів .

Стандартні схеми:

US-ASCII Семирозрядний ASCII, він же ISO646-US, відомий також як основний латинський блок набору символів Unicode ISO-8859-1 ISO Латинський алфавіт ISO № 1, також ISO-LATIN-1

UTF-8 восьмибітний формат трансформації UCS

UTF-16BE Шістнадцятирозрядний формат трансформації UCS, порядок байтів великого рівня

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

UTF-16 Шістнадцятибітовий формат трансформації UCS, порядок байтів, ідентифікований необов'язковою позначкою байт-порядку

Приклад:

import java.net.URLEncoder;

String stringEncoded = URLEncoder.encode(
    "This text must be encoded! aeiou áéíóú ñ, peace!", "UTF-8");

1

Перший параметр - це рядок для кодування; друге - ім'я кодування символів, яке слід використовувати (наприклад, UTF-8).


0

В якості додаткового посилання на інші відповіді замість використання "UTF-8" ви можете використовувати:

HTTP.UTF_8

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


Неправильно , цей клас знаходиться в бібліотечному org.apache.http.protocol.HTTPкласі Apache HttpClient 4.x.
Buhake Sindi

@BuhakeSindi правда, я читав API 1, але це був Android, а не Java, так чи інакше він існує до Java 7, навіть застарілий уже ха-ха.
htafoya

ні, цього класу ніколи не існувало в жодній версії Java JDK. Android слідкує за бібліотекою Apache HttpClient (я не здивуюся, якщо вони звідти взяли і вихідний код).
Buhake Sindi

3
попередження: [депрекація] UTF_8 у HTTP застаріла .
sgtdck

0

Використання org.apache.commons.httpclient.URIне є суворо проблемою; що проблема в тому , що ви націлені на неправильний конструктор, який є амортизується.

Використовуючи просто

new URI( [string] );

Дійсно буде позначати це як знецінене. Необхідно навести хоча б один додатковий аргумент (перший, нижче), а в ідеалі два:

  1. escaped: вірно, якщо послідовність символів URI знаходиться в уникнутий формі. помилково інакше.
  2. charset: рядок діаграми, щоб зробити кодування втечі, якщо потрібно

Це буде націлено на не амортизований конструктор у цьому класі. Тож ідеальне використання було б таким:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.