Digamos que tengo una URL
http://example.com/query?q=
y tengo una consulta ingresada por el usuario como:
palabra al azar £ 500 banco $
Quiero que el resultado sea una URL correctamente codificada:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
¿Cuál es la mejor manera de lograr esto? Traté de URLEncodercrear objetos URI / URL pero ninguno de ellos salió del todo bien.

Respuestas:
URLEncoderEs el camino a seguir. Solo debe tener en cuenta para codificar solo el nombre y / o el valor del parámetro de la cadena de consulta individual, no la URL completa, con seguridad no el carácter separador del parámetro de la cadena de consulta&ni el carácter separador de nombre-valor del parámetro=.Tenga en cuenta que los espacios en los parámetros de consulta están representados por
+, no%20, que es legítimamente válido. El%20suele usarse para representar espacios en URI en sí (la parte antes del carácter URI-consulta cadena de separación?), no en cadena de consulta (la parte que sigue?).También tenga en cuenta que hay tres
encode()métodos. Uno sin unCharsetsegundo argumento y otro con unStringsegundo argumento que arroja una excepción marcada. El que no tieneCharsetargumento está en desuso. Nunca lo use y siempre especifique elCharsetargumento. El javadoc incluso recomienda explícitamente utilizar la codificación UTF-8, según lo dispuesto por RFC3986 y W3C .Ver también:
fuente
URLEncoderes para parámetros de consulta codificados en URL que cumplen con lasapplication/x-www-form-urlencodedreglas. Los parámetros de ruta no encajan en esta categoría. Necesita un codificador URI en su lugar.No lo usaría
URLEncoder. Además de ser nombrado incorrectamente (URLEncoderno tiene nada que ver con las URL), ineficiente (utiliza unStringBufferlugar de Builder y hace un par de otras cosas que son lentas) También es demasiado fácil arruinarlo.En cambio, usaría
URIBuildero primavera delorg.springframework.web.util.UriUtils.encodeQueryo de los Comunes ApacheHttpClient. La razón es que tiene que escapar del nombre de los parámetros de consulta (es decir, la respuesta de BalusCq) de manera diferente al valor del parámetro.El único inconveniente de lo anterior (que descubrí dolorosamente) es que las URL no son un verdadero subconjunto de URI .
Código de muestra:
Como solo estoy enlazando a otras respuestas, marqué esto como wiki comunitario. Siéntase libre de editar.
fuente
URLEncoderes como su javadoc dice que tiene la intención de codificar los parámetros de la cadena de consulta conforme aapplication/x-www-form-urlencodedlo descrito en la especificación HTML: w3.org/TR/html4/interact/… . Algunos usuarios lo confunden / abusan para codificar URI completos, como aparentemente hizo el respondedor actual.Primero debe crear un URI como:
Luego convierta ese Uri a una cadena ASCII:
Ahora su cadena de url está completamente codificada, primero hicimos una codificación de url simple y luego la convertimos en una cadena ASCII para asegurarnos de que ningún carácter fuera de US-ASCII permanezca en la cadena. Así es exactamente como lo hacen los navegadores.
fuente
URL.toURI()no.+reemplazo de espacios, pero aceptó el% 20, por lo que esta solución funcionó mejor que BalusC, ¡gracias!Guava 15 ahora ha agregado un conjunto de escapes de URL sencillos .
fuente
URLEncoder.URLEncoderno lo hace.La biblioteca Apache Http Components proporciona una opción ordenada para construir y codificar parámetros de consulta:
Con el uso de HttpComponents 4.x - URLEncodedUtils
Para el uso de HttpClient 3.x - EncodingUtil
fuente
Aquí hay un método que puede usar en su código para convertir una cadena de url y un mapa de parámetros en una cadena de url codificada válida que contenga los parámetros de consulta.
fuente
Huellas dactilares
¿Que está sucediendo aquí?
1. Dividir URL en partes estructurales. Úselo
java.net.URLpara ello.2. ¡ Codifique cada parte estructural correctamente!
3. Use
IDN.toASCII(putDomainNameHere)para codificar Punycode el nombre del host!4. Utilícelo
java.net.URI.toASCIIString()para codificar en porcentaje, unicode codificado con NFC - (¡mejor sería NFKC!). Para obtener más información, consulte: Cómo codificar correctamente esta URLEn algunos casos es aconsejable verificar si la url ya está codificada . También reemplace los espacios codificados '+' con espacios codificados '% 20'.
Aquí hay algunos ejemplos que también funcionarán correctamente.
La solución pasa alrededor de 100 de los casos de prueba proporcionados por Web Plattform Tests .
fuente
En Android usaría este código:
Donde
Uries unandroid.net.Urifuente
En mi caso, solo necesitaba pasar la url completa y codificar solo el valor de cada parámetro. No encontré un código común para hacerlo (¡!!) así que creé este pequeño método para hacer el trabajo:
Utiliza org.apache.commons.lang3.StringUtils
fuente
Puede usar el siguiente código.
fuente
=y&, lo que no es correcto.