java.net.URLEncoder.encode (String) está en desuso, ¿qué debo usar en su lugar?

192

Recibo la siguiente advertencia cuando uso java.net.URLEncoder.encode:

advertencia: codificación [obsoleta] (java.lang.String)
         en java.net.URLEncoder ha quedado en desuso

¿Qué debería usar en su lugar?

Frank Krueger
fuente
23
Esto se responde en la etiqueta de desuso en los documentos: "En su lugar, use el método de codificación (String, String) para especificar la codificación". Ver java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Respuestas:

278

Use el otro encodemétodo en URLEncoder :

URLEncoder.encode(String, String)

El primer parámetro es el texto a codificar; el segundo es el nombre de la codificación de caracteres a usar (por ejemplo, UTF-8). Por ejemplo:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Will Wagner
fuente
14
@jsh: Estoy confundido, ¿por qué no debería haber un URLDecoder? ¿Por qué esto hace que Java esté hinchado? Estos son métodos estáticos. Se necesitaría la misma cantidad de esfuerzo para escribir. Si te gusta Python, ¿por qué estás programando en Java? ¿Es porque más personas usan Java que Python y obtuviste un trabajo de Java en lugar de Python?
stepanian
10
Lo llama hinchado porque está superpoblando el espacio de nombres de clase global. ¿Por qué tener URLEncoder.encode y URLDecoder.decode cuando podría tener URL.encode y URL.decode, o incluso solo URLEncoder.decode? ¿Por qué hacerlo todo redundante e hinchado? Porque es java.
BT
30
Y luego debe manejar la UnsupportedEncodingException, aunque UTF-8 debería ser compatible prácticamente en todas partes.
Dave Cameron
8
@tc .: Java 7 introdujo estas constantes: StandardCharsets.US_ASCII, StandardCharsets.UTF_8etc. Por desgracia, URLEncoder.encodeno acepta un Charset... (pero muchas otras moethods hacer).
sleske
12
Sugerencia menor: uso URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). El uso de la constante estática UTF_8's toString()método como el esquema de codificación de caracteres lanza java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]como los toString()retornos 'java.nio.charset.CharsetICU [UTF-8]'. Para obtener el "UTF-8" deseado, utilice su name()método.
et_l
31

Deberías usar:

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

Use la clase URLEncoder :

URLEncoder.encode(String s, String enc)

Dónde :

s - Cadena a traducir.

enc : el nombre de una codificación de caracteres compatible .

Cajas estándar:

US-ASCII ASCII de siete bits, también conocido como ISO646-US, también conocido como el bloque latino básico del juego de caracteres Unicode ISO-8859-1 ISO Latin Alphabet No. 1, también conocido como ISO-LATIN-1

UTF-8 Formato de transformación UCS de ocho bits

UTF-16BE Formato de transformación UCS de dieciséis bits, orden de bytes big-endian

UTF-16LE Formato de transformación UCS de dieciséis bits, orden de bytes little endian

UTF-16 Formato de transformación UCS de dieciséis bits, orden de bytes identificado por una marca opcional de orden de bytes

Ejemplo:

import java.net.URLEncoder;

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

El primer parámetro es la cadena a codificar; el segundo es el nombre de la codificación de caracteres a utilizar (por ejemplo, UTF-8).

usuario3591718
fuente
0

Como referencia adicional para las otras respuestas, en lugar de usar "UTF-8" puede usar:

HTTP.UTF_8

que se incluye desde Java 4 como parte de la biblioteca org.apache.http.protocol, que también se incluye desde Android API 1.

htafoya
fuente
Incorrecto , esta clase se encuentra en la org.apache.http.protocol.HTTPclase de biblioteca Apache HttpClient 4.x.
Buhake Sindi
@BuhakeSindi es cierto, leí API 1 pero era de Android, no de Java, de cualquier manera existe antes de Java 7, incluso está en desuso ya jaja.
htafoya
no, esta clase nunca existió en ninguna versión de Java JDK. Android sigue la biblioteca Apache HttpClient (no me sorprendería si también tomaron el código fuente de allí).
Buhake Sindi
3
advertencia: [desaprobación] UTF_8 en HTTP ha quedado en desuso .
sgtdck
0

El uso de org.apache.commons.httpclient.URIno es estrictamente un problema; lo que es un problema es que apuntas al constructor incorrecto, que se deprecia.

Usando solo

new URI( [string] );

De hecho lo marcará como depreciado. Lo que se necesita es proporcionar como mínimo un argumento adicional (el primero, a continuación), e idealmente dos:

  1. escaped: verdadero si la secuencia de caracteres URI está en forma de escape. falso de lo contrario.
  2. charset: la cadena charset para hacer la codificación de escape, si es necesario

Esto apuntará a un constructor no depreciado dentro de esa clase. Entonces, un uso ideal sería como tal:

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

Un poco loco al final del juego (un pelo más de 11 años después, ¡por ejemplo! ), Pero espero que esto ayude a alguien más, especialmente si el método en el otro extremo todavía espera un URI, como org.apache.commons.httpclient.setURI().

R. Kåbis
fuente