Solución:
URLEncoder
es el camino a seguir. Solo debes tener en cuenta para codificar solamente el nombre y / o valor del parámetro de la cadena de consulta individual, no la URL completa, seguro que no el carácter separador del parámetro de la cadena de consulta &
ni el carácter separador de nombre-valor del parámetro =
.
String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);
Cuando todavía no esté en Java 10 o más reciente, utilice StandardCharsets.UTF_8.toString()
como argumento de juego de caracteres, o cuando todavía no está en Java 7 o más reciente, utilice "UTF-8"
.
Tenga en cuenta que los espacios en los parámetros de consulta están representados por +
, no %20
, que es legítimamente válido. los %20
generalmente se usa para representar espacios en el propio URI (la parte antes del carácter separador de cadena de consulta de URI ?
), no en la cadena de consulta (la parte posterior ?
).
También tenga en cuenta que hay tres encode()
métodos. Uno sin Charset
como segundo argumento y otro con String
como segundo argumento que arroja una excepción comprobada. El que no tiene Charset
El argumento está en desuso. Nunca lo use y siempre especifique el Charset
argumento. El javadoc incluso recomienda explícitamente usar la codificación UTF-8, como lo exigen RFC3986 y W3C.
Todos los demás caracteres no son seguros y primero se convierten en uno o más bytes utilizando algún esquema de codificación. Luego, cada byte está representado por la cadena de 3 caracteres “% xy”, donde xy es la representación hexadecimal de dos dígitos del byte. El esquema de codificación recomendado para usar es UTF-8. Sin embargo, por razones de compatibilidad, si no se especifica una codificación, se utiliza la codificación predeterminada de la plataforma.
Ver también:
- Lo que todo desarrollador web debe saber sobre la codificación de URL
Yo no usaria URLEncoder
. Además de tener un nombre incorrecto (URLEncoder
no tiene nada que ver con las URL), ineficaz (utiliza un StringBuffer
en lugar de Builder y hace un par de otras cosas que son lentas) También es demasiado fácil arruinarlo.
En su lugar, usaría URIBuilder
o de primavera org.springframework.web.util.UriUtils.encodeQuery
o Commons Apache HttpClient
. La razón es que debe escapar del nombre de los parámetros de consulta (es decir, la respuesta de BalusC q
) de forma 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 las URI.
Código de muestra:
import org.apache.http.client.utils.URIBuilder;
URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank $");
String url = ub.toString();
// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24
Como solo estoy enlazando a otras respuestas, lo marqué como un wiki de la comunidad. Siéntete libre de editar.
Primero debe crear un URI como:
String urlStr = "http://www.example.com/CEREC® Materials & Accessories/IPS Empress® CAD.pdf"
URL url= new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
Luego convierta esa cadena Uri a ASCII:
urlStr=uri.toASCIIString();
Ahora su cadena de URL está completamente codificada, primero hicimos una codificación de URL simple y luego la convertimos a Cadena ASCII para asegurarnos de que no quede ningún carácter fuera de US-ASCII en la cadena. Así es exactamente como lo hacen los navegadores.