Android: howto parse URL cadena con espacios hasta objeto URI ?

? Mannaz @ | Original: StackOverFlow
---

Tengo una cadena que representa una dirección URL que contiene espacios y quiero convertirlo en un objeto URI . Si es prueba simple de hacer

String myString = "http://myhost.com/media/mp3s/9/Agenda of swine - 13. Persecution Ascension_ leave nothing standing.mp3";
URI myUri = new URI(myString);

it gives me

java.net.URISyntaxException: Illegal character in path at index X

donde el índice X es la posición del primer espacio en la cadena de URL.

¿Cómo puedo analizar myString en un URI objetar ?

---

Top 5 Respuesta

1Bozho @
java.net.URLEncoder.encode(finalPartOfString, "utf-8");

Esto http://www.w3schools.com/TAGS/ref_urlencode.asp la cadena.

finalPartOfString Es la pieza después de la última barra - en su caso, el nombre de la canción, como parece.

2BalusC @

Usted debe de hecho http://java.sun.com/javase/6/docs/api/java/net/URLEncoder.html la http://en.wikipedia.org/wiki/Percent-encoding . Desde la cadena en realidad contiene la dirección URL completa, es difícil correctamente cifrar la URL de la misma. Usted no sabe lo que recorta URLEncode debe tenerse en cuenta y cuáles no. No se puede predecir que en un crudo / de antemano . El problema realmente necesita ser resuelto en un nivel superior . ¿De dónde viene que String viene? ¿Es hardcoded ? A continuación, sólo cambiar tú mismo en consecuencia. ¿Viene en como entrada de usuario ? Validarlo y mostrar error, deja al usuario a resolver en sí .

En cualquier modo, si usted puede asegurarse de que son sólo los espacios en la dirección URL de la que hace que sea válida, entonces usted puede hacer también un char a caracter reemplazar con String :

+

o una cadena por cadena reemplazar con URI uri = new URI(string.replace(' ', '+')); :

%20

O si usted puede asegurarse de que es sólo la parte después de la última barra que debe ser codificado, entonces también puede simplemente hacer:

URI uri = new URI(string.replace(" ", "%20"));
3Phileo99 @

Para manejar espacios, @ y otros caracteres no seguros en ubicaciones arbitrarias en la ruta URL, Uso Uri.Builder en combinación con una instancia local de URL como he descrito http://stackoverflow.com/a/22059606/923920 :

int pos = string.lastIndexOf('/') + 1;
URI uri = new URI(string.substring(0, pos) + URLEncoder.encode(string.substring(pos), "utf-8"));
4siddmuk2005 @
private Uri.Builder builder;
public Uri getUriFromUrl(String thisUrl) {
    URL url = new URL(thisUrl);
    builder =  new Uri.Builder()
                            .scheme(url.getProtocol())
                            .authority(url.getAuthority())
                            .appendPath(url.getPath());
    return builder.build();
}