Java – Convertir cadena a objeto URI válido

Estoy tratando de obtener un objeto java.net.URI de una String . La cadena tiene algunos caracteres que necesitarán ser reemplazados por su porcentaje de secuencias de escape. Pero cuando uso URLEncoder para codificar la cadena con la codificación UTF-8, incluso los / se reemplazan con sus secuencias de escape.

¿Cómo puedo obtener una URL codificada válida de un objeto String?

Http://www.google.com?q=a b da http% 3A% 2F% 2www.google.com … mientras que quiero que la salida sea http://www.google.com?q=a% 20b

¿Puede alguien por favor decirme cómo lograr esto.

Estoy intentando hacer esto en una aplicación de Android. Así que tengo acceso a un número limitado de bibliotecas.

Puede probar: org.apache.commons.httpclient.util.URIUtil.encodeQuery en el proyecto Apache commons-httpclient

Así (ver URIUtil ):

 URIUtil.encodeQuery("http://www.google.com?q=ab") 

se convertirá:

 http://www.google.com?q=a%20b 

Por supuesto, puedes hacerlo tú mismo, pero el análisis de URI puede ser bastante complicado …

Android siempre ha tenido la clase Uri como parte del SDK: http://developer.android.com/reference/android/net/Uri.html

Simplemente puede hacer algo como:

 String requestURL = String.format("http://www.example.com/?a=%s&b=%s", Uri.encode("foo bar"), Uri.encode("100% fubar'd")); 

Voy a añadir una sugerencia aquí dirigida a los usuarios de Android. Usted puede hacer esto que evita tener que conseguir cualquier bibliotecas externas. Además, todas las soluciones de búsqueda / sustitución de caracteres sugeridas en algunas de las respuestas anteriores son peligrosas y deben evitarse.

Probar esto:

 String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4"; URL url = new URL(urlStr); URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); url = uri.toURL(); 

Usted puede ver que en esta URL en particular, necesito tener esos espacios codificados para que yo pueda usarlo para una solicitud.

Esto se aprovecha de un par de funciones disponibles en las clases de Android. En primer lugar, la clase de URL puede romper una url en sus componentes adecuados por lo que no hay necesidad de hacer cualquier trabajo de búsqueda / sustitución de cadenas. En segundo lugar, este enfoque aprovecha la característica de clase URI de los componentes que escapan correctamente cuando se construye un URI a través de componentes en lugar de una sola cadena.

La belleza de este enfoque es que usted puede tomar cualquier cadena de url válida y que tenga que trabajar sin necesidad de ningún conocimiento especial de él mismo.

Incluso si se trata de una antigua publicación con una respuesta ya aceptada, publico mi respuesta alternativa porque funciona bien para el presente número y parece que nadie mencionó este método.

Con la biblioteca java.net.URI:

 URI uri = URI.create(URLString); 

Y si desea una cadena con formato de URL que le corresponda:

 String validURLString = uri.toASCIIString(); 

A diferencia de muchos otros métodos (por ejemplo, java.net.URLEncoder) este reemplaza sólo los caracteres ASCII inseguros (como ç , é …).


En el ejemplo anterior, si URLString es el siguiente String :

 "http://www.domain.com/façon+word" 

La validURLString será:

 "http://www.domain.com/fa%C3%A7on+word" 

Que es una URL bien formateada.

Si no te gustan las bibliotecas, ¿qué te parece esto?

Tenga en cuenta que no debe utilizar esta función en toda la URL, sino que debe utilizar esto en los componentes … por ejemplo, sólo el componente "ab", a medida que construye la URL – de lo contrario la computadora no sabrá qué personajes se supone Para tener un significado especial y que se supone que tienen un significado literal.

 /** Converts a string into something you can safely insert into a URL. */ public static String encodeURIcomponent(String s) { StringBuilder o = new StringBuilder(); for (char ch : s.toCharArray()) { if (isUnsafe(ch)) { o.append('%'); o.append(toHex(ch / 16)); o.append(toHex(ch % 16)); } else o.append(ch); } return o.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; } 

Puede utilizar los constructores de argumentos múltiples de la clase URI . Desde el URI javadoc:

Los constructores de argumentos múltiples citan caracteres ilegales según lo requieran los componentes en los que aparecen. El carácter de porcentaje ('%') siempre se cita por estos constructores. Se conservan otros caracteres.

Así que si usas

 URI uri = new URI("http", "www.google.com?q=ab"); 

Entonces usted consigue http:www.google.com?q=a%20b que no está muy bien, pero es un poco más cerca.

Si sabe que su cadena no tendrá fragmentos de URL (por ejemplo, http://example.com/page#anchor ), puede utilizar el siguiente código para obtener lo que desea:

 String s = "http://www.google.com?q=ab"; String[] parts = s.split(":",2); URI uri = new URI(parts[0], parts[1], null); 

Para estar seguro, debe escanear la cadena para # caracteres, pero esto debería empezar.

Tuve problemas similares para uno de mis proyectos para crear un objeto URI de una cadena. No pude encontrar ninguna solución limpia tampoco. Esto es lo que me ocurrió:

 public static URI encodeURL(String url) throws MalformedURLException, URISyntaxException { URI uriFormatted = null; URL urlLink = new URL(url); uriFormatted = new URI("http", urlLink.getHost(), urlLink.getPath(), urlLink.getQuery(), urlLink.getRef()); return uriFormatted; } 

Puede utilizar el siguiente constructor de URI en su lugar para especificar un puerto si es necesario:

 URI uri = new URI(scheme, userInfo, host, port, path, query, fragment); 

Bueno, yo intenté usar

 String converted = URLDecoder.decode("toconvert","UTF-8"); 

Espero que esto es lo que realmente estabas buscando?

El blog java.net tuvo una clase el otro día que pudo haber hecho lo que querías (pero está abajo ahora mismo, así que no puedo comprobarlo).

Este código aquí probablemente podría ser modificado para hacer lo que quiere:

http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/UriBuilder.java

Aquí es el que estaba pensando en java.net: https://urlencodedquerystring.dev.java.net/

O quizás podrías usar esta clase:

http://developer.android.com/reference/java/net/URLEncoder.html

Que está presente en Android desde el nivel 1 de la API.

Molesto sin embargo, trata espacios especialmente (reemplazándolos con + en vez de% 20). Para conseguir esto simplemente usamos este fragmento:

URLEncoder.encode(value, "UTF-8").replace("+", "%20");

Terminé usando el httpclient-4.3.6:

 import org.apache.http.client.utils.URIBuilder; public static void main (String [] args) { URIBuilder uri = new URIBuilder(); uri.setScheme("http") .setHost("www.example.com") .setPath("/somepage.php") .setParameter("username", "Hello Günter") .setParameter("p1", "parameter 1"); System.out.println(uri.toString()); } 

El resultado será:

  Http://www.example.com/somepage.php?username=Hello+G%C3%BCnter&p1=paramter+1 
  • Serialización gson de cadena unicode no funciona
  • ¿Cómo mostrar el texto hindi en android?
  • Cómo configurar UTF-8 para el archivo xml analizado utilizando SAX Parser en android
  • ¿Cómo puedo poner utf-16 caracteres en Android cadena de recursos?
  • UTF-8 de codificación en Volley Requests
  • Búsqueda en una base de datos SQLite que contenga datos cítricos
  • EditText devuelve mejorado ISO-8859-1 en lugar de codificación UTF-8 para umlauts alemán?
  • Post datos UTF-8 codificados en el servidor pierde ciertos caracteres
  • Cadena de byte con UTF-8 da diferentes resultados en Android que en Windows JVM
  • Soporte unicode en android ndk
  • Conversión UTF-8 en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.