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?


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()
  )
);

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


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");

1

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


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.


Ź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().

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.