java - sirven - jtextpane definicion
Codificación de URL de Java de parámetros de cadena de consulta (9)
Di que tengo una URL
http://example.com/query?q=
y tengo una consulta ingresada por el usuario como:
palabra aleatoria £ 500 bank $
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? Intenté con URLEncoder
y creando objetos URI / URL, pero ninguno de ellos salió bien.
- Utilice este : URLEncoder.encode (consulta, StandardCharsets.UTF_8.displayName ()); o esto: URLEncoder.encode (consulta, "UTF-8");
Puedes usar el siguiente código.
String encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8");//not change String encodedUrl2 = URLEncoder.encode(query, "UTF-8");//changed String encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());//changed System.out.println("url1 " + encodedUrl1 + "/n" + "url2=" + encodedUrl2 + "/n" + "url3=" + encodedUrl3);
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.
String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
if (parameters == null) {
return url;
}
for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {
final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");
if (!url.contains("?")) {
url += "?" + encodedKey + "=" + encodedValue;
} else {
url += "&" + encodedKey + "=" + encodedValue;
}
}
return url;
}
En android usaría este código:
Uri myUI = Uri.parse ("http://example.com/query").buildUpon().appendQueryParameter("q","random word A3500 bank 24").build();
Donde Uri
es un android.net.Uri
Guava 15 ahora ha agregado un conjunto de escapadores de URL sencillos .
La biblioteca de componentes de Apache Http proporciona una opción ordenada para construir y codificar parámetros de consulta:
Con el uso de HttpComponents 4.x - URLEncodedUtils
Para uso de HttpClient 3.x - EncodingUtil
Primero debes 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 la codificación de url simple y luego la convertimos en 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.
Yo no usaría URLEncoder
. Además de tener un nombre incorrecto ( URLEncoder
no tiene nada que ver con las URL), es ineficiente (usa un StringBuffer
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 Spring''s org.springframework.web.util.UriUtils.encodeQuery
o Commons Apache HttpClient
. La razón es que tiene que escapar del nombre de los parámetros de consulta (es decir, la respuesta de BalusC q
) 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:
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
Ya que solo estoy enlazando a otras respuestas, marqué esto como un wiki de la comunidad. Siéntase libre de editar.
URLEncoder
debería ser 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, por supuesto, no es el carácter separador del parámetro de la cadena de consulta ni el carácter separador del valor del nombre del parámetro =
.
String q = "random word £500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");
Tenga en cuenta que los espacios en los parámetros de consulta están representados por +
, no por %20
, lo que es legítimamente válido. El %20
se usa generalmente para representar espacios en el URI en sí mismo (¿la parte antes del carácter separador de cadena de consulta URI ?
), No en la cadena de consulta (la parte después de ?
).
También tenga en cuenta que hay dos métodos encode()
. Uno sin argumento charset y otro con. El que no tiene argumento charset está en desuso. Nunca lo uses y siempre especifiques el argumento charset. El URLEncoder incluso recomienda explícitamente utilizar la codificación UTF-8, según lo estipulado por RFC3986 y W3C .
Todos los demás caracteres son inseguros 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:
1. Dividir la URL en partes estructurales. Usa java.net.URL
para ello.
2. Codificar cada parte estructural correctamente!
3. Utilice IDN.toASCII(putDomainNameHere)
para codificar el nombre de host en Punycode .
4. Use java.net.URI.toASCIIString()
para codificar en porcentaje, codificado en NFC, (¡mejor sería NFKC!). Para obtener más información, consulte: Cómo codificar correctamente esta URL
URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);
Huellas dactilares
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$