java.net.URLEncoder.encode (String) ist veraltet. Was soll ich stattdessen verwenden?

192

Bei der Verwendung wird folgende Warnung angezeigt java.net.URLEncoder.encode:

Warnung: [veraltet] codieren (java.lang.String)
         in java.net.URLEncoder ist veraltet

Was soll ich stattdessen verwenden?

Frank Krueger
quelle
23
Dies wird im Verfalls-Tag in den Dokumenten beantwortet: "Verwenden Sie stattdessen die Codierungsmethode (String, String), um die Codierung anzugeben." Siehe java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Antworten:

277

Verwenden Sie die andere encodeMethode in URLEncoder :

URLEncoder.encode(String, String)

Der erste Parameter ist der zu codierende Text. Der zweite ist der Name der zu verwendenden Zeichenkodierung (z UTF-8. B. ). Beispielsweise:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Will Wagner
quelle
14
@jsh: Ich bin verwirrt, warum sollte es keinen URLDecoder geben? Warum macht dies Java aufgebläht? Dies sind statische Methoden. Die Eingabe würde den gleichen Aufwand erfordern. Wenn Sie Python mögen, warum programmieren Sie in Java? Liegt es daran, dass mehr Menschen Java als Python verwenden und Sie einen Java-Job anstelle eines Python-Jobs haben?
Stepanian
10
Er nennt es aufgebläht, weil es den globalen Klassennamensraum überfüllt. Warum URLEncoder.encode und URLDecoder.decode, wenn Sie URL.encode und URL.decode oder auch nur URLEncoder.decode haben könnten? Warum alles überflüssig und aufgebläht machen? Weil es Java ist.
BT
30
Und dann müssen Sie die UnsupportedEncodingException behandeln, obwohl UTF-8 so ziemlich überall unterstützt werden sollte.
Dave Cameron
8
@tc .: Java 7 eingeführt , um diese Konstanten: StandardCharsets.US_ASCII, StandardCharsets.UTF_8usw. Leider URLEncoder.encodeakzeptiert keine a Charset... (aber viele andere moethods tun).
Sleske
12
Kleiner Vorschlag - verwenden URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Unter Verwendung der statischen Konstante UTF_8‚s toString()Verfahren wie das Zeichencodierungsschema führt java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]als die toString()returns‚java.nio.charset.CharsetICU [UTF-8]‘. Um das gewünschte "UTF-8" zu erhalten, verwenden Sie name()stattdessen dessen Methode.
et_l
31

Du solltest benutzen:

URLEncoder.encode("NAME", "UTF-8");
Atul Darne
quelle
24

Verwenden Sie die Klasse URLEncoder :

URLEncoder.encode(String s, String enc)

Wo :

s - Zu übersetzender String.

enc - Der Name einer unterstützten Zeichenkodierung .

Standard-Zeichensätze:

US-ASCII Sieben-Bit-ASCII, auch bekannt als ISO646-US, auch bekannt als der lateinische Basisblock des Unicode-Zeichensatzes ISO-8859-1 ISO Latin Alphabet Nr. 1, auch bekannt als ISO-LATIN-1

UTF-8 Acht-Bit-UCS-Transformationsformat

UTF-16BE 16-Bit-UCS-Transformationsformat, Big-Endian-Bytereihenfolge

UTF-16LE 16-Bit-UCS-Transformationsformat, Little-Endian-Bytereihenfolge

UTF-16 Sechzehn-Bit-UCS-Transformationsformat, Bytereihenfolge, gekennzeichnet durch eine optionale Bytereihenfolge

Beispiel:

import java.net.URLEncoder;

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

Der erste Parameter ist der zu codierende String. Der zweite ist der Name der zu verwendenden Zeichenkodierung (z. B. UTF-8).

user3591718
quelle
0

Als zusätzliche Referenz für die anderen Antworten können Sie anstelle von "UTF-8" Folgendes verwenden:

HTTP.UTF_8

Dies ist seit Java 4 als Teil der Bibliothek org.apache.http.protocol enthalten, die auch seit Android API 1 enthalten ist.

htafoya
quelle
Falsch , diese Klasse befindet sich in der Apache HttpClient 4.x-Bibliotheksklasse org.apache.http.protocol.HTTP.
Buhake Sindi
@BuhakeSindi stimmt, ich habe API 1 gelesen, aber es war von Android, nicht von Java, so oder so existiert es vor Java 7, es ist sogar schon veraltet, haha.
Htafoya
nein, diese Klasse nie existierte in jeder Version des Java JDK. Android folgt der Apache HttpClient-Bibliothek (ich bin nicht überrascht, wenn sie auch den Quellcode von dort übernommen haben).
Buhake Sindi
3
Warnung: [veraltet] UTF_8 in HTTP ist veraltet .
sgtdck
0

Die Verwendung von org.apache.commons.httpclient.URIist nicht ausschließlich ein Problem; was ein Problem ist , dass Sie den falschen Konstruktor Ziel, das wird abgeschrieben.

Mit just

new URI( [string] );

Wird es in der Tat als abgeschrieben kennzeichnen. Was benötigt wird, ist, mindestens ein zusätzliches Argument (das erste unten) und im Idealfall zwei anzugeben:

  1. escaped: true, wenn die URI-Zeichenfolge in Escape-Form vorliegt. sonst falsch.
  2. charset: Die Zeichensatzzeichenfolge, die bei Bedarf die Escape-Codierung ausführt

Dies zielt auf einen nicht abgeschriebenen Konstruktor innerhalb dieser Klasse ab. Eine ideale Verwendung wäre also eine solche:

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

Ein bisschen verrückt spät im Spiel (ein Haar über 11 Jahre später - egad! ), Aber ich hoffe, das hilft jemand anderem, besonders wenn die Methode am anderen Ende immer noch einen URI erwartet, wie z org.apache.commons.httpclient.setURI().

R. Kåbis
quelle