Android : howto parse URL String con spazi per oggetto URI ?

? Mannaz @ | Original: StackOverFlow
---

Ho una stringa che rappresenta un URL contenente spazi e voglio convertirlo in un oggetto URI . Se è semplice provare a fare

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

dove l'indice X è la posizione del primo spazio nella stringa URL .

Come posso analizzare myString in un URI oggetto ?

---

Top 5 Risposta

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

Ciò http://www.w3schools.com/TAGS/ref_urlencode.asp la stringa .

finalPartOfString È la parte dopo l'ultima barra - nel vostro caso, il nome della canzone, come sembra .

2BalusC @

Si dovrebbe infatti http://java.sun.com/javase/6/docs/api/java/net/URLEncoder.html il http://en.wikipedia.org/wiki/Percent-encoding . Dal momento che la stringa contenga effettivamente l'URL completo, è difficile correttamente URL - encode esso . Non sai che riduce drasticamente URLEncode dovrebbero essere prese in considerazione e che non . Non è possibile prevedere che in una prima / in anticipo . Il problema realmente deve essere risolto ad un livello superiore . Da dove viene quella String provengono da ? È hardcoded ? Poi basta cambiare di conseguenza. Le viene in come input utente ? Convalidare e dimostrare errore, lasciare che l' utente a risolvere in sé .

Ad ogni modo, se è possibile garantire che sono solo gli spazi in URL che lo rende nullo, allora si può anche semplicemente fare un char -by - char sostituire con String :

+

o una stringa -by -string sostituire con URI uri = new URI(string.replace(' ', '+')); :

%20

Oppure, se è possibile garantire che è solo la parte dopo l'ultima barra che deve essere codificato, allora si può anche semplicemente fare :

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

Per gestire gli spazi, @ e altri caratteri non sicuri in posizioni arbitrarie nel percorso URL, Usa Uri.Builder in combinazione con un'istanza locale di URL, ho descritto 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();
}