Estou esperando
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
para saída:
Hello%20World
(20 é código hexadecimal ASCII para espaço)
No entanto, o que recebo é:
Hello+World
Estou usando o método errado? Qual é o método correto que devo usar?
Respostas:
Isso se comporta conforme o esperado. o
URLEncoder
implementa as especificações HTML para saber como codificar URLs em formulários HTML.Dos javadocs :
e da especificação HTML :
Você precisará substituí-lo, por exemplo:
fonte
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Um espaço é codificado
%20
em URLs e+
em dados enviados por formulários (tipo de conteúdo application / x-www-form-urlencoded). Você precisa do primeiro.Usando a goiaba :
Você pode usar UrlEscapers :
Não use String.replace, isso codificaria apenas o espaço. Use uma biblioteca.
fonte
Essa classe executa
application/x-www-form-urlencoded
codificação de tipo em vez de codificação de porcentagem, portanto, substituirpor
+
é um comportamento correto.Partida javadoc:
fonte
url
, o espaço deve ser interpretado como%20
. Então, precisamos fazerurl.replaceAll("\\+", "%20")
? E se for javascript, não devemos usar aescape
função UseencodeURI
ou emencodeURIComponent
vez disso. Isso foi o que eu pensei.Parâmetros de consulta de codificação
OU se você quiser escapar de caracteres dentro do URI
fonte
org.apache.commons.httpclient.util.URIUtil
parece ser a maneira mais eficiente de resolver o problema!Hello+World
é como um navegador codifica os dados do formulário (application/x-www-form-urlencoded
) para umaGET
solicitação e esse é o formulário geralmente aceito para a parte da consulta de um URI.Se você enviou essa solicitação a um servlet Java, o servlet decodificaria corretamente o valor do parâmetro. Normalmente, a única vez que há problemas aqui é se a codificação não corresponder.
A rigor, não há exigência nas especificações HTTP ou URI de que a parte da consulta seja codificada usando
application/x-www-form-urlencoded
pares de valores-chave; a parte da consulta precisa estar no formato que o servidor da web aceita. Na prática, é improvável que isso seja um problema.Geralmente, seria incorreto usar essa codificação para outras partes do URI (o caminho, por exemplo). Nesse caso, você deve usar o esquema de codificação conforme descrito na RFC 3986 .
Mais aqui .
fonte
As outras respostas apresentam uma substituição manual de cadeias de caracteres, o URLEncoder , que realmente codifica para o formato HTML, o URIUtil abandonado do Apache ou usando os UrlEscapers da Guava . O último está bom, exceto que não fornece um decodificador.
O Apache Commons Lang fornece o URLCodec , que codifica e decodifica de acordo com o formato de URL rfc3986 .
Se você já usa o Spring, também pode optar por usar a classe UriUtils .
fonte
"+" está correto. Se você realmente precisar de% 20, substitua os plusses depois.
fonte
+
caractere no texto original deve ser codificado como%2B
.+
está correto sem conhecer o contexto é, pelo menos, pedante. Votado. Leia outras respostas para saber quando + ou% 20 deve ser usado.Apenas lutando com isso também no Android, consegui encontrar o Uri.encode (String, String) enquanto específico do android (android.net.Uri) pode ser útil para alguns.
codificação estática de String (String s, String allow)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
fonte
Isso funcionou para mim
fonte
Embora bastante antigo, no entanto, uma resposta rápida:
O Spring fornece UriUtils - com isso você pode especificar como codificar e qual parte está relacionada a um URI, por exemplo
Eu os uso porque já estamos usando o Spring, ou seja, nenhuma biblioteca adicional é necessária!
fonte
Confira a classe java.net.URI.
fonte
Sim, este método java.net.URLEncoder.encode não foi criado para converter "" para "20%" de acordo com a especificação ( fonte ).
Mesmo que este não seja o método correto, você pode modificá-lo para:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
tenha um bom dia =).fonte
URLEncoder.encode
) e corrigi-lo usando oreplaceAll
que só funcionaria nesse caso específico. Use a classe e o método corretos, veja outras respostas.USE MyUrlEncode.URLencoding (URL da string, String enc) para lidar com o problema
fonte
use o conjunto de caracteres "
ISO-8859-1
" para o URLEncoderfonte