que necesito el código de Java para codificar URL para evitar caracteres especiales como espacios y% y & ... etcCómo codificar URL para evitar caracteres especiales en Java?
Respuesta
construcción URL es complicado debido a que diferentes partes de la URL tienen diferentes reglas para lo que se permiten caracteres: por ejemplo, el signo más es reservada en el componente de consulta de una URL porque representa un espacio, pero en el componente de ruta de la URL, un signo más no tiene ningún significado especial y los espacios se codifican como "% 20".
RFC 2396 explica (en la sección 2.4.2) que una URL completa está siempre en su forma codificada: toma las cadenas para los componentes individuales (esquema, autoridad, ruta, etc.), codifica cada una según sus propias reglas , y luego combinarlos en la cadena 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, construir un objeto URI
utilizando el constructor de cadena única y luego usar 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. Es no correcto para concatenar cadenas no codificadas para hacer una URL "no codificada" y luego pasarla a través de URLEncoder
. Si lo hace, surgirán problemas (en particular el mencionado respecto a espacios y signos más en el camino).
Estoy tratando de escribirlo mysekf .... ¿Correcto? public static String encode (String str) \t \t { \t \t \t StringBuilder sb = new StringBuilder(); \t \t \t for (int i = 0; i
@adham, no, la codificación URL correcta es mucho más que escaparse de esos tres caracteres. Ese código puede producir resultados correctos para * algunas * URL, pero hay muchas que no se manejarán correctamente. Solo usa la clase 'URI'. – Wyzard
sí, sé que hay muchos otros personajes ... pero por favor puede dar un ejemplo simplw para la clase URI – Adham
Si no desea hacerlo manualmente utilizar Apache Commons - Biblioteca Codec. La clase que se está 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);
¿Por qué se rechazó esta respuesta? –
Solo una nota. URLCodec es un reemplazo para URLEncoder/URLDecoder. NO SIGNIFICA codificar una URL completa, que es lo que muestra el ejemplo. Es decir, incluso http: // se convierte en http% 3A% 2F% 2F. A menos que eso sea realmente lo que quieres hacer. – Nicholi
Ambos me dan el mismo resultado "incorrecto" \t URLCodec urlCodec = new URLCodec(); \t System.out.println (urlCodec.encode ("FOO BAR")); // FOO + BAR \t System.out.println (URLEncoder.encode ("FOO BAR", "UTF-8")); FOO + BAR – Topera
Me volvería a repetir lo Wyzard wrote pero añadir que:
- de parámetros de consulta, la codificación HTML a menudo es exactamente lo que el servidor está a la espera; fuera de estos, es cierto que
URLEncoder
no debe utilizarse - la especificación más reciente URI es RFC 3986, por lo que debe referirse a que, como fuente primaria
me escribió una entrada de blog hace un tiempo acerca de este asunto: Java: safe character handling and URL building
Este es un duplicado de la pregunta a continuación.Puede encontrar información más detallada y discusión sobre este tema en el siguiente pregunta
HTTP URL Address Encoding in 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 " %$&+,/:;[email protected]<>#%".indexOf(ch) >= 0;
}
}
Aquí está mi solución, que es bastante fácil:
En lugar de codificar la propia URL I codificada de los parámetros que estaba pasando porque el parámetro era la entrada del usuario y el usuario podía ingresar cualquier cadena inesperada de caracteres especiales así que esto funcionó para mí bien :)
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;
Lo siento, accidentalmente lo hice, pero esta solución funciona. –
También pasé bastante tiempo con este tema, por lo que 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();
- 1. Cómo codificar caracteres especiales en contenido html
- 2. file_get_contents - caracteres especiales en URL
- 3. Java - codificar URL
- 4. URL y decodificación de caracteres especiales en Java
- 5. codificar Por qué URL, o qué caracteres para codificar
- 6. reemplazar caracteres especiales en cadena en java
- 7. ¿Cómo escapar caracteres especiales HTML en Java?
- 8. NSURL con caracteres especiales
- 9. mod_rewrite NE flag - ¿Cuándo es útil codificar caracteres especiales en la URL?
- 10. Reescritura de caracteres especiales y URL
- 11. ¿Cómo reemplazo los caracteres especiales en una URL?
- 12. ¿Cómo convierto caracteres especiales usando java?
- 13. ajax publicar caracteres especiales
- 14. Escapar caracteres especiales en Java Expresiones regulares
- 15. ¿Qué significan estos caracteres especiales en Java?
- 16. Cómo codificar períodos para URL en Javascript?
- 17. expresión regular para encontrar caracteres especiales en Java
- 18. Escapar caracteres especiales en cmd
- 19. Cómo codificar URL contiene caracteres Unicode con PHP
- 20. Django problema de resolución de caracteres especiales en la url
- 21. Cómo codificar URL en Groovy?
- 22. Caracteres especiales en XML
- 23. caracteres especiales en sed
- 24. Expresión regular para excluir caracteres especiales
- 25. Cómo evitar que window.location.pathname escape caracteres en URL
- 26. Cómo convertir caracteres especiales a caracteres normales?
- 27. Cómo convertir caracteres especiales a UTF-8?
- 28. URL caracteres válidos. java para validar
- 29. ¿Cómo puedo eliminar caracteres especiales?
- 30. ¿Cómo clasifica .NET caracteres especiales?
este tipo de problema es precisamente la razón por la cual algunos sitio nunca, nunca, personajes de uso que requieran códigos de escape/codificación en sus URLs. * StackOverflow * parece ser un sitio así (solo mire la URL limpia). Creo que las personas que enlazan a archivos en URL que tienen, por ejemplo, espaciado de caracteres en su nombre (y personas que utilizan caracteres espaciados en los archivos para ese asunto) merecen ser filmados. Y los que argumentan con este hecho incluso más;) – SyntaxT3rr0r
(Duplicado sugerido por @fmucar en su respuesta a continuación). – halfer