java.net.URLEncoder.encode (String) está obsoleto, o que devo usar?

192

Recebo o seguinte aviso ao usar java.net.URLEncoder.encode:

aviso: codificação [obsoleta] (java.lang.String)
         no java.net.URLEncoder foi descontinuado

O que devo usar em vez disso?

Frank Krueger
fonte
23
Isso é respondido na tag de reprovação nos documentos: "Em vez disso, use o método encode (String, String) para especificar a codificação". Consulte java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Respostas:

278

Use o outro encodemétodo no URLEncoder :

URLEncoder.encode(String, String)

O primeiro parâmetro é o texto a codificar; o segundo é o nome da codificação de caracteres a ser usada (por exemplo, UTF-8). Por exemplo:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Will Wagner
fonte
14
@jsh: Estou confuso, por que não deveria haver um URLDecoder? Por que isso torna o Java inchado? Estes são métodos estáticos. Também seria necessário o mesmo esforço para digitar. Se você gosta de Python, por que está programando em Java? É porque mais pessoas usam Java que Python e você conseguiu um emprego em Java em vez de um trabalho em Python?
stepanian
10
Ele está chamando de inchado porque está superpovoando o espaço de nomes da classe global. Por que ter URLEncoder.encode e URLDecoder.decode quando você pode ter URL.encode e URL.decode, ou mesmo apenas URLEncoder.decode? Por que tornar tudo redundante e inchado? Porque é java.
BT
30
E então você precisa lidar com a UnsupportedEncodingException, mesmo que o UTF-8 deva ser suportado praticamente em todos os lugares.
Dave Cameron
8
@tc .: Java 7 introduziu estas constantes: StandardCharsets.US_ASCII, StandardCharsets.UTF_8etc. Infelizmente, URLEncoder.encodenão aceita um Charset... (mas muitas outras moethods fazer).
Sleske
12
Sugestão menor - use URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Usando a constante estática UTF_8do toString()método como o esquema de codificação de caracteres lança java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]como os toString()retornos 'java.nio.charset.CharsetICU [UTF-8]'. Para obter o "UTF-8" desejado, use seu name()método.
et_l
31

Você deveria usar:

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

Use a classe URLEncoder :

URLEncoder.encode(String s, String enc)

Onde :

s - String a ser traduzida.

enc - O nome de uma codificação de caracteres suportada .

Conjuntos de caracteres padrão:

US-ASCII ASCII de sete bits, também conhecido como ISO646-US, também conhecido como bloco latino básico do conjunto de caracteres Unicode ISO-8859-1 Alfabeto latino ISO nº 1, também conhecido como ISO-LATIN-1

Formato de transformação UCS de oito bits UTF-8

UTF-16BE Formato de transformação UCS de dezesseis bits, ordem de bytes big-endian

Formato de transformação UCS de dezesseis bits UTF-16LE , ordem de bytes little-endian

Formato de transformação UCS de dezesseis bits UTF-16 , ordem de bytes identificada por uma marca de ordem de bytes opcional

Exemplo:

import java.net.URLEncoder;

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

O primeiro parâmetro é a String a codificar; o segundo é o nome da codificação de caracteres a ser usada (por exemplo, UTF-8).

user3591718
fonte
0

Como referência adicional para as outras respostas, em vez de usar "UTF-8", você pode usar:

HTTP.UTF_8

que está incluído desde o Java 4 como parte da biblioteca org.apache.http.protocol, que também está incluído desde a API 1 do Android.

htafoya
fonte
Errado , essa classe é encontrada na org.apache.http.protocol.HTTPclasse de biblioteca Apache HttpClient 4.x.
Buhake Sindi
@BuhakeSindi verdade, eu li a API 1, mas era do Android e não Java, de qualquer forma que existe antes do Java 7, é até obsoleto já haha.
Htafoya
não, essa classe nunca existiu em nenhuma versão do Java JDK. O Android segue a biblioteca Apache HttpClient (não ficarei surpreso se eles tiraram o código-fonte de lá também).
Buhake Sindi
3
aviso: [descontinuação] UTF_8 no HTTP foi descontinuado .
Sgtdck 16/10
0

O uso de org.apache.commons.httpclient.URInão é estritamente um problema; o que é um problema é que você direcione o construtor errado, que é depreciado.

Usando apenas

new URI( [string] );

De fato, o sinalizará como depreciado. O que é necessário é fornecer no mínimo um argumento adicional (o primeiro, abaixo) e, idealmente, dois:

  1. escaped: true se a sequência de caracteres URI estiver na forma de escape. false caso contrário.
  2. charset: a sequência de caracteres charset para fazer a codificação de escape, se necessário

Isso terá como alvo um construtor não depreciado nessa classe. Portanto, um uso ideal seria o seguinte:

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

Um pouco louco no final do jogo (um cabelo mais de 11 anos depois - egad! ), Mas espero que isso ajude outra pessoa, especialmente se o método mais distante for ainda esperando um URI, como org.apache.commons.httpclient.setURI().

R. Kåbis
fonte