java.net.URLEncoder.encode (String) est obsolète, que dois-je utiliser à la place?

192

Je reçois l'avertissement suivant lors de l'utilisation java.net.URLEncoder.encode:

avertissement: [obsolescence] encode (java.lang.String)
         dans java.net.URLEncoder est obsolète

Que dois-je utiliser à la place?

Frank Krueger
la source
23
Ceci est répondu dans la balise d'obsolescence dans la documentation: "Utilisez plutôt la méthode encode (String, String) pour spécifier le codage." Voir java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Réponses:

278

Utilisez l'autre encodeméthode dans URLEncoder :

URLEncoder.encode(String, String)

Le premier paramètre est le texte à encoder; le second est le nom du codage de caractères à utiliser (par exemple, UTF-8). Par exemple:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Will Wagner
la source
14
@jsh: Je suis confus, pourquoi n'y aurait-il pas d'URLDecoder? Pourquoi cela fait-il gonfler Java? Ce sont des méthodes statiques. Il faudrait le même effort pour taper non plus. Si vous aimez Python, pourquoi programmez-vous en Java? Est-ce parce que plus de gens utilisent Java que Python et que vous avez un travail Java au lieu d'un travail Python?
stepanian
10
Il l'appelle gonflé parce que sa surpopulation de l'espace de noms de classe globale. Pourquoi avoir URLEncoder.encode et URLDecoder.decode alors que vous pourriez avoir URL.encode et URL.decode, ou même simplement URLEncoder.decode? Pourquoi rendre tout cela redondant et gonflé? Parce que son java.
BT
30
Et puis vous devez gérer l'exception UnsupportedEncodingException, même si UTF-8 devrait être pris en charge à peu près partout.
Dave Cameron
8
@tc .: Java 7 a introduit ces constantes: StandardCharsets.US_ASCII, StandardCharsets.UTF_8etc. Malheureusement, URLEncoder.encoden'accepte pas Charset... (mais beaucoup d' autres moethods faire).
sleske
12
Suggestion mineure - utilisation URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). En utilisant la constante statique UTF_8de toString()méthode que le schéma de codage de caractères jette java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]les toString()retours « java.nio.charset.CharsetICU [UTF-8] ». Pour obtenir le "UTF-8" souhaité, utilisez name()plutôt sa méthode.
et_l
31

Tu devrais utiliser:

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

Utilisez la classe URLEncoder :

URLEncoder.encode(String s, String enc)

Où :

s - Chaîne à traduire.

enc - Le nom d'un encodage de caractères pris en charge .

Jeux de caractères standard:

US-ASCII ASCII sept bits, alias ISO646-US, alias le bloc Latin de base du jeu de caractères Unicode ISO-8859-1 Alphabet latin ISO n ° 1, alias ISO-LATIN-1

Format de transformation UCS 8 bits UTF-8

UTF-16BE Format de transformation UCS 16 bits, ordre des octets big-endian

UTF-16LE Format de transformation UCS 16 bits, ordre des octets petit boutiste

UTF-16 Format de transformation UCS 16 bits, ordre des octets identifié par une marque facultative d'ordre des octets

Exemple:

import java.net.URLEncoder;

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

Le premier paramètre est la chaîne à encoder; le second est le nom du codage de caractères à utiliser (par exemple, UTF-8).

utilisateur3591718
la source
0

Comme référence supplémentaire pour les autres réponses, au lieu d'utiliser "UTF-8", vous pouvez utiliser:

HTTP.UTF_8

qui est inclus depuis Java 4 dans le cadre de la bibliothèque org.apache.http.protocol, qui est également incluse depuis l'API Android 1.

htafoya
la source
Erreur , cette classe se trouve dans la org.apache.http.protocol.HTTPclasse de bibliothèque Apache HttpClient 4.x.
Buhake Sindi
@BuhakeSindi vrai, j'ai lu l'API 1 mais c'était d'Android pas de Java, de toute façon il existe avant Java 7, il est même déjà obsolète haha.
htafoya
non, cette classe n'a jamais existé dans aucune version du JDK Java. Android suit la bibliothèque Apache HttpClient (je ne serai pas surpris s'ils ont également pris le code source à partir de là).
Buhake Sindi
3
avertissement: [obsolète] UTF_8 dans HTTP est obsolète .
sgtdck
0

L'utilisation de org.apache.commons.httpclient.URIn'est pas strictement un problème; le problème est que vous ciblez le mauvais constructeur, qui est déprécié.

En utilisant juste

new URI( [string] );

Le signalera en effet comme déprécié. Ce qu'il faut, c'est fournir au moins un argument supplémentaire (le premier, ci-dessous), et idéalement deux:

  1. escaped: true si la séquence de caractères URI est sous forme d'échappement. faux sinon.
  2. charset: la chaîne de caractères pour effectuer l'encodage d'échappement, si nécessaire

Cela ciblera un constructeur non amorti au sein de cette classe. Un usage idéal serait donc comme tel:

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

Un peu fou-tard dans le jeu (un cheveu plus de 11 ans plus tard - par exemple ! ), Mais j'espère que cela aidera quelqu'un d'autre, surtout si la méthode à l'extrémité attend toujours un URI, tel que org.apache.commons.httpclient.setURI().

R. Kåbis
la source