urlencoder safe example codificar java url-encoding

example - url safe java



¿Cómo codificar URL para evitar caracteres especiales en Java? (6)

Esta pregunta ya tiene una respuesta aquí:

Necesito el código de Java para codificar URL para evitar caracteres especiales como espacios y% y & ... etc.


Aquí está mi solución, que es bastante fácil:

En lugar de codificar la URL en sí, codifiqué los parámetros que estaba pasando porque el parámetro fue ingresado por el usuario y el usuario pudo ingresar cualquier cadena inesperada de caracteres especiales, así que esto funcionó bien para mí :)

String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/ try { review = URLEncoder.encode(review,"utf-8"); review = review.replace(" " , "+"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String URL = "www.test.com/test.php"+"?user_review="+review;


Este es un duplicado de la pregunta a continuación. Puede encontrar información más detallada y discusión sobre este tema en la siguiente pregunta

Codificación de la dirección URL HTTP en Java

public class URLParamEncoder { public static String encode(String input) { StringBuilder resultStr = new StringBuilder(); for (char ch : input.toCharArray()) { if (isUnsafe(ch)) { resultStr.append(''%''); resultStr.append(toHex(ch / 16)); resultStr.append(toHex(ch % 16)); } else { resultStr.append(ch); } } return resultStr.toString(); } private static char toHex(int ch) { return (char) (ch < 10 ? ''0'' + ch : ''A'' + ch - 10); } private static boolean isUnsafe(char ch) { if (ch > 128 || ch < 0) return true; return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0; } }


Me gustaría hacer eco de lo que escribió Wyzard, pero añado eso:

  • para los parámetros de consulta, la codificación HTML es a menudo exactamente lo que espera el servidor; fuera de estos, es correcto que URLEncoder no se debe usar
  • la especificación de URI más reciente es RFC 3986 , por lo que debe referirse a eso como fuente primaria

Hace un tiempo escribí una publicación en el blog sobre este tema: Java: manejo seguro de caracteres y construcción de URL


Si no desea hacerlo manualmente, use Apache Commons - Codec library. La clase que estás viendo es: org.apache.commons.codec.net.URLCodec

String final url = "http://www.google.com?...." String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);


También pasé bastante tiempo con este problema, así que esa es mi solución:

String urlString2Decode = "http://www.test.com/äüö/path with blanks/"; String decodedURL = URLDecoder.decode(urlString2Decode, "UTF-8"); URL url = new URL(decodedURL); URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); String decodedURLAsString = uri.toASCIIString();


La construcción de URL es complicada porque diferentes partes de la URL tienen reglas diferentes para los caracteres permitidos: por ejemplo, el signo más está reservado en el componente de consulta de una URL porque representa un espacio, pero en el componente de ruta de la URL, una signo más no tiene ningún significado especial y los espacios están codificados como "% 20".

RFC 2396 explica (en la sección 2.4.2) que una URL completa está siempre en su forma codificada: usted toma las cadenas de los componentes individuales (esquema, autoridad, ruta, etc.), codifica cada una de acuerdo con sus propias reglas, y luego Combínelos en la cadena de URL completa. Intentar crear una cadena completa de URL sin codificar y luego codificarla por separado conduce a errores sutiles, como espacios en la ruta que se cambian incorrectamente a signos más (que un servidor compatible con RFC interpretará como signos más reales, espacios no codificados).

En Java, la forma correcta de construir una URL es con la clase URI . Utilice uno de los constructores de argumentos múltiples que toma los componentes de URL como cadenas separadas, y escapará a cada componente correctamente según las reglas de ese componente. El método toASCIIString() le proporciona una cadena codificada y escapada correctamente que puede enviar a un servidor. Para decodificar una URL, construya un objeto URI utilizando el constructor de cadena única y luego use los métodos de acceso (como getPath() ) para recuperar los componentes decodificados.

¡No use la clase URLEncoder ! A pesar del nombre, esa clase realmente hace codificación de forma HTML, no codificación de URL. No es correcto concatenar cadenas no codificadas para crear una URL "no codificada" y luego pasarla a través de un URLEncoder . Si lo hace, surgirán problemas (en particular el mencionado respecto a espacios y signos más en el camino).