Estoy esperando
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
a la salida:
Hello%20World
(20 es el código ASCII Hex para el espacio)
Sin embargo, lo que obtengo es:
Hello+World
¿Estoy usando el método incorrecto? ¿Cuál es el método correcto que debería usar?
Respuestas:
Esto se comporta como se esperaba. los
URLEncoder
implementos de las especificaciones de HTML para cómo codificar las direcciones URL en formularios HTML.De los javadocs :
y de la especificación HTML :
Tendrá que reemplazarlo, por ejemplo:
fuente
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Se codifica un espacio
%20
en URL y+
en datos enviados de formularios (tipo de contenido application / x-www-form-urlencoded). Necesitas lo primero.Usando guayaba :
Puedes usar UrlEscapers :
No use String.replace, esto solo codificaría el espacio. Use una biblioteca en su lugar.
fuente
Esta clase realiza
application/x-www-form-urlencoded
codificación de tipo en lugar de codificación porcentual, por lo tanto, reemplazacon
+
es un comportamiento correcto.De javadoc:
fuente
url
, el espacio debe interpretarse como%20
. ¿Entonces tenemos que hacerurl.replaceAll("\\+", "%20")
? Y si es javascript, no deberíamos usar laescape
función. UsoencodeURI
o en suencodeURIComponent
lugar. Es lo que pensaba.Codificar parámetros de consulta
O si quieres escapar de los caracteres dentro de URI
fuente
org.apache.commons.httpclient.util.URIUtil
parece ser la forma más eficiente de resolver el problema!Hello+World
es cómo un navegador codificará los datos del formulario (application/x-www-form-urlencoded
) para unaGET
solicitud y este es el formulario generalmente aceptado para la parte de consulta de un URI.Si envió esta solicitud a un servlet Java, el servlet decodificará correctamente el valor del parámetro. Por lo general, la única vez que hay problemas aquí es si la codificación no coincide.
Estrictamente hablando, no hay ningún requisito en las especificaciones HTTP o URI de que la parte de la consulta se codifique utilizando
application/x-www-form-urlencoded
pares clave-valor; la parte de la consulta solo debe estar en la forma que acepta el servidor web. En la práctica, es poco probable que esto sea un problema.En general, sería incorrecto utilizar esta codificación para otras partes del URI (la ruta, por ejemplo). En ese caso, debe usar el esquema de codificación como se describe en RFC 3986 .
Más aquí .
fuente
Las otras respuestas presentan un reemplazo de cadena manual, URLEncoder , que en realidad codifica para el formato HTML, el URIUtil abandonado de Apache , o el uso de UrlEscapers de Guava . El último está bien, excepto que no proporciona un decodificador.
Apache Commons Lang proporciona el URLCodec , que codifica y decodifica de acuerdo con el formato URL rfc3986 .
Si ya está utilizando Spring, también puede optar por usar su clase UriUtils .
fuente
"+" es correcto. Si realmente necesita% 20, reemplace los Plus usted mismo después.
fuente
+
supone que un carácter en el texto original se codifica como%2B
.+
es correcto sin conocer el contexto es, al menos, pedante. Voto negativo Lea otras respuestas para saber cuándo se utilizará + o% 20.Solo he estado luchando con esto también en Android, logré tropezar con Uri.encode (String, String) mientras que es específico para Android (android.net.Uri) podría ser útil para algunos.
codificación de cadena estática (cadena s, cadena permitida)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
fuente
Esto funciono para mi
fuente
Aunque bastante viejo, sin embargo, una respuesta rápida:
Spring proporciona UriUtils: con esto puede especificar cómo codificar y qué parte está relacionada desde un URI, por ejemplo
Los uso porque ya estamos usando Spring, es decir, ¡no se requiere una biblioteca adicional!
fuente
Echa un vistazo a la clase java.net.URI.
fuente
Sí, este método java.net.URLEncoder.encode no se hizo para convertir "" a "20%" de acuerdo con las especificaciones ( fuente ).
Incluso si este no es el método correcto, puede modificarlo para:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
tener un buen día =).fuente
URLEncoder.encode
) y parchearlo usandoreplaceAll
lo que solo funcionaría en este caso específico. Use la clase y el método correctos en su lugar, vea otras respuestas.USE MyUrlEncode.URLencoding (String url, String enc) para manejar el problema
fuente
use el juego de caracteres "
ISO-8859-1
" para URLEncoderfuente