java.net.URLEncoder.encode (String) jest przestarzały, czego powinienem użyć zamiast tego?

192

Podczas używania pojawia się następujące ostrzeżenie java.net.URLEncoder.encode:

ostrzeżenie: kodowanie [przestarzałe] (java.lang.String)
         w java.net.URLEncoder został uznany za przestarzały

Czego powinienem używać zamiast tego?

Frank Krueger
źródło
23
Odpowiedź znajduje się w znaczniku wycofania w dokumentacji: „Zamiast tego należy użyć metody kodowania (ciąg, ciąg), aby określić kodowanie”. Zobacz java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Odpowiedzi:

278

Użyj innej encodemetody w URLEncoder :

URLEncoder.encode(String, String)

Pierwszy parametr to tekst do zakodowania; drugi to nazwa kodowania znaku, którego należy użyć (np UTF-8.). Na przykład:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Will Wagner
źródło
14
@jsh: Jestem zdezorientowany, dlaczego nie powinien istnieć URLDecoder? Dlaczego powoduje to rozdętą Javę? To są metody statyczne. Pisanie wymagałoby tyle samo wysiłku. Jeśli lubisz Python, dlaczego programujesz w Javie? Czy to dlatego, że więcej osób korzysta z Java niż Python, a ty masz zadanie Java zamiast zadania Python?
stepanian
10
Nazywa to rozdętym, ponieważ przeludnia globalną przestrzeń nazw klas. Dlaczego warto mieć URLEncoder.encode i URLDecoder.decode, skoro możesz mieć URL.encode i URL.decode, a nawet po prostu URLEncoder.decode? Dlaczego to wszystko jest zbędne i wzdęte? Ponieważ to java.
BT
30
A potem trzeba poradzić sobie z UnsupportedEncodingException, mimo że UTF-8 powinien być obsługiwany praktycznie wszędzie.
Dave Cameron,
8
@tc .: Java 7 wprowadzono te stałe: StandardCharsets.US_ASCII, StandardCharsets.UTF_8itd. Niestety, URLEncoder.encodenie akceptuje Charset... (ale wiele innych moethods zrobić).
śleske
12
Niewielka sugestia - użycie URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Za pomocą stałej statycznego UTF_8„S toString()sposobu jak schemat kodowania postać rzuca java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]jak toString()zwrotów«java.nio.charset.CharsetICU [UTF-8]». Aby uzyskać pożądany „UTF-8”, użyj jego name()metody.
et_l
31

Powinieneś użyć:

URLEncoder.encode("NAME", "UTF-8");
Atul Darne
źródło
24

Użyj klasy URLEncoder :

URLEncoder.encode(String s, String enc)

Gdzie :

s - Ciąg do przetłumaczenia.

enc - nazwa obsługiwanego kodowania znaków .

Standardowe zestawy znaków:

US-ASCII Siedmiobitowy ASCII, znany również jako ISO646-US, znany również jako podstawowy blok łaciński zestawu znaków Unicode ISO-8859-1 ISO alfabet łaciński nr 1, znany również jako ISO-LATIN-1

UTF-8 Ośmiobitowy format transformacji UCS

UTF-16BE Szesnastobitowy format transformacji UCS, kolejność bajtów big-endian

UTF-16LE Szesnastobitowy format transformacji UCS, kolejność bajtów little-endian

UTF-16 Szesnastobitowy format transformacji UCS, kolejność bajtów identyfikowana przez opcjonalny znak kolejności bajtów

Przykład:

import java.net.URLEncoder;

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

Pierwszym parametrem jest Łańcuch do zakodowania; drugi to nazwa kodowania znaków do użycia (np. UTF-8).

użytkownik3591718
źródło
0

Jako dodatkowe odniesienie dla innych odpowiedzi, zamiast używać „UTF-8” , możesz użyć:

HTTP.UTF_8

który jest zawarty od Java 4 jako część biblioteki org.apache.http.protocol, który jest również zawarty od API Android 1.

htafoya
źródło
Źle , ta klasa znajduje się w org.apache.http.protocol.HTTPklasie biblioteki Apache HttpClient 4.x.
Buhake Sindi
@BuhakeSindi prawda, czytam API 1, ale to był Android, a nie Java, tak czy inaczej istnieje przed Java 7, jest nawet przestarzały już haha.
htafoya
nie, ta klasa nigdy nie istniała w żadnej wersji JDK Java. Android podąża za biblioteką Apache HttpClient (nie będę zaskoczony, jeśli pobiorą również kod źródłowy).
Buhake Sindi
3
ostrzeżenie: [deprecation] UTF_8 w HTTP został uznany za przestarzały .
sgtdck
0

Korzystanie z org.apache.commons.httpclient.URInie jest ściśle problemem; problemem jest to, że celujesz w niewłaściwy konstruktor, który jest amortyzowany.

Używam tylko

new URI( [string] );

Rzeczywiście oznaczy to jako amortyzację. Potrzebne jest podanie co najmniej jednego dodatkowego argumentu (pierwszego, poniżej), a najlepiej dwóch:

  1. escaped: true, jeśli sekwencja znaków URI jest w postaci znaku zmiany znaczenia. fałsz inaczej.
  2. charset: ciąg znaków, aby wykonać kodowanie specjalne, jeśli jest wymagane

Będzie to dotyczyć niezalecanego konstruktora w tej klasie. Idealne użycie byłoby takie:

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

Trochę szalony-późno w grze (włosy ponad 11 lat później - egad! ), Ale mam nadzieję, że to pomaga komuś innemu, szczególnie jeśli metoda na drugim końcu jest wciąż oczekuje URI, takiego jak org.apache.commons.httpclient.setURI().

R. Kåbis
źródło