java.net.URLEncoder.encode (String) è obsoleto, cosa devo usare invece?


192

Ricevo il seguente avviso durante l'utilizzo java.net.URLEncoder.encode:

attenzione: codifica [deprecazione] (java.lang.String)
         in java.net.URLEncoder è stato deprecato

Cosa dovrei usare invece?


23
Questa è la risposta nel tag di deprecazione nei documenti: "Invece, usa il metodo encode (String, String) per specificare la codifica." Vedi java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Risposte:


278

Utilizzare l'altro encodemetodo in URLEncoder :

URLEncoder.encode(String, String)

Il primo parametro è il testo da codificare; il secondo è il nome della codifica dei caratteri da utilizzare (ad esempio, UTF-8). Per esempio:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);

14
@jsh: sono confuso, perché non dovrebbe esserci un URLDecoder? Perché questo rende Java gonfio? Questi sono metodi statici. Ci vorrebbe lo stesso sforzo per digitare entrambi. Se ti piace Python, perché stai programmando in Java? È perché più persone usano Java di Python e hai un lavoro Java invece di Python?
stepanian

10
Lo chiama gonfio perché sovrappopola lo spazio dei nomi della classe globale. Perché avere URLEncoder.encode e URLDecoder.decode quando potresti avere URL.encode e URL.decode o anche solo URLEncoder.decode? Perché rendere tutto ridondante e gonfio? Perché è Java.
BT,

30
E poi devi gestire UnsupportedEncodingException, anche se UTF-8 dovrebbe essere supportato praticamente ovunque.
Dave Cameron,

8
@tc .: Java 7 ha introdotto queste costanti: StandardCharsets.US_ASCII, StandardCharsets.UTF_8ecc Purtroppo, URLEncoder.encodenon accetta un Charset... (ma molti altri moethods fare).
sleske,

12
Suggerimento minore: utilizzare URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Usando la costante staticaUTF_8 's toString()metodo come uno schema di codifica dei caratteri getta java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]come toString()restituisce 'java.nio.charset.CharsetICU [UTF-8]'. Per ottenere "UTF-8" desiderato utilizzare name()invece il suo metodo.
et_l


24

Utilizzare la classe URLEncoder :

URLEncoder.encode(String s, String enc)

Dove :

S - Stringa da tradurre.

enc - Il nome di una codifica di caratteri supportata .

Set di caratteri standard:

US-ASCII ASCII a sette bit, alias ISO646-US, alias il blocco latino di base del set di caratteri Unicode ISO-8859-1 ISO Alfabeto latino n. 1, alias ISO-LATIN-1

UTF-8 Formato di trasformazione UCS a otto bit

UTF-16BE Formato di trasformazione UCS a sedici bit, ordine byte big-endian

UTF-16LE Formato di trasformazione UCS a sedici bit, ordine byte little-endian

UTF-16 Formato di trasformazione UCS a sedici bit, ordine di byte identificato da un contrassegno di ordine di byte opzionale

Esempio:

import java.net.URLEncoder;

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

1

Il primo parametro è la stringa da codificare; il secondo è il nome della codifica dei caratteri da utilizzare (ad es. UTF-8).


0

Come riferimento aggiuntivo per le altre risposte, invece di utilizzare "UTF-8" è possibile utilizzare:

HTTP.UTF_8

che è incluso da Java 4 come parte della libreria org.apache.http.protocol, incluso anche dall'API 1 di Android.


Sbagliato , questa classe si trova nella org.apache.http.protocol.HTTPclasse di libreria Apache HttpClient 4.x.
Buhake Sindi,

@BuhakeSindi vero, ho letto API 1 ma era di Android non Java, in entrambi i casi esiste prima di Java 7, è addirittura deprecato già ahah.
htafoya,

no, questa classe non è mai esistita in nessuna versione di JDK Java. Android segue la libreria Apache HttpClient (non mi sorprenderò se da lì prendessero anche il codice sorgente).
Buhake Sindi,

3
avviso: [deprecazione] UTF_8 in HTTP è stato deprecato .
sgtdck,

0

L'uso di org.apache.commons.httpclient.URInon è strettamente un problema; ciò che è un problema è che hai come target il costruttore sbagliato, che è ammortizzato.

Usando solo

new URI( [string] );

Lo segnalerà come ammortizzato. È necessario fornire almeno un argomento aggiuntivo (il primo, di seguito) e idealmente due:

  1. escaped: vero se la sequenza di caratteri URI è in formato escape. falso altrimenti.
  2. charset: la stringa charset per eseguire la codifica di escape, se necessario

Questo sarà indirizzato a un costruttore non deprezzato all'interno di quella classe. Quindi un utilizzo ideale sarebbe come tale:

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

Un po 'follemente in ritardo nel gioco (un capello oltre 11 anni dopo - egad! ), Ma spero che questo aiuti qualcun altro, soprattutto se il metodo in fondo sta ancora aspettando un URI, come org.apache.commons.httpclient.setURI().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.