2010-12-31 46 views
27

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?

+8

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

+0

(Duplicado sugerido por @fmucar en su respuesta a continuación). – halfer

Respuesta

59

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).

+0

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

+1

@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

+0

sí, sé que hay muchos otros personajes ... pero por favor puede dar un ejemplo simplw para la clase URI – Adham

4

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); 
+4

¿Por qué se rechazó esta respuesta? –

+2

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

+0

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

1

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

10

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; 
    } 

} 
-1

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; 
+1

Lo siento, accidentalmente lo hice, pero esta solución funciona. –

0

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(); 
Cuestiones relacionadas