2011-06-01 46 views
12

¿Cómo puedo codificar valores dinámicos de cadena para crear instancias de URL? Necesito reemplazar espacios con% 20, acentos, caracteres no ASCII ...? Intenté usar URLEncoder pero también codifica el carácter '/' y si doy una cadena codificada con URLEncoder al constructor de URL obtengo una MalformedURLException (sin protocolo).Java - codificar URL

+4

Por favor, dar algún ejemplo de cuerdas y estás código. –

+0

diferentes reglas de codificación se aplicarán a diferentes [partes del URI] (http://illegalargumentexception.blogspot.com/2009/12/java-safe-character-handling-and-url.html#URI2009_ANATOMY). Como sugiere Lukas, proporcione ejemplos de la información con la que comienza y con qué desea terminar. – McDowell

Respuesta

3

Lo que usted dice es que quiere codificar parte de su URL pero no todo. Me parece que tendrás que dividirlo en partes, pasar las que codifiques a través del codificador y volver a montarlas para obtener toda la URL.

32

URLEncoder tiene un muy nombre engañoso. De acuerdo con el Javadocs utilizó los parámetros de formulario de codificación utilizando el tipo MIME application/x-www-form-urlencoded.

Con esto dicho se puede utilizar para codificar, por ejemplo, parámetros de consulta. Por ejemplo, si un parámetro se parece a su equivalente &/?# codificada puede ser utilizado como:

String url = "http://host.com/?key=" + URLEncoder.encode("&/?#"); 

A menos que tenga esas necesidades especiales del URL javadocs sugiere el uso de new URI(..).toURL que realiza URI de codificación de acuerdo con RFC2396.

La forma recomendada para gestionar la codificación y decodificación de direcciones URL es utilizar URI

El siguiente ejemplo de

new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL(); 

produce el resultado http://host.com/path/?key=%7C%20?/%23ä#fragment. Tenga en cuenta que los caracteres tales como ?&/ son codificados en.

Para obtener más información, consulte los mensajes HTTP URL Address Encoding in Java o how to encode URL to avoid special characters in java.


EDITAR

Debido a que su entrada es una url cadena, usando uno de los constructor con parámetros de URI no le ayudará. Tampoco puede usar new URI(strUrl) directamente ya que no cita los parámetros de url.

Así que en esta etapa se debe utilizar un truco para conseguir lo que quiere:

public URL parseUrl(String s) throws Exception { 
    URL u = new URL(s); 
    return new URI(
      u.getProtocol(), 
      u.getAuthority(), 
      u.getPath(), 
      u.getQuery(), 
      u.getRef()). 
      toURL(); 
} 

Antes de poder utilizar esta rutina que tiene que sanitize la cadena para asegurarse de que representa un absoluta url. Veo dos enfoques para esto:

  1. Adivinando. Prefiera http:// a la cadena a menos que ya esté presente.

  2. crear la dirección URL de un contexto usando new URL(URL context, String spec)

+1

URI uri = nuevo URI ("www.google.com"); uri.toURL(); -> excepción: "URI no es absoluto" – Arutha

+3

No es un [URI válido] (http://www.ietf.org/rfc/rfc2396.txt). Utilice el * esquema * correcto, por ejemplo, http. –

+0

Recibo cadenas de usuarios ... – Arutha

Cuestiones relacionadas