Android: howto parse URL de Cordas com espaços para URI objeto ?

? Mannaz @ | Original: StackOverFlow

Eu tenho um string representando uma URL contendo espaços e quer convertê-lo para um objeto URI. Se é try simples de fazer

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

onde o índice X é a posição do primeiro espaço na seqüência de URL .

Como posso analisar myString em um URI objeto ?

Top 5 Responder

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

Isso vai http://www.w3schools.com/TAGS/ref_urlencode.asp a string.

finalPartOfString É a parte após o último slash - no seu caso, o nome da música, como parece.

2BalusC @

Você deve, de fato, o http://java.sun.com/javase/6/docs/api/java/net/URLEncoder.html http://en.wikipedia.org/wiki/Percent-encoding . Uma vez que a seqüência realmente contém a URL completa, é difícil corretamente URL - codificá-lo . Você não sabe que corta URLEncode deve ser levado em conta e quais não. Você não pode prever que, em uma matéria / de antemão. O problema realmente precisa ser resolvido em um nível superior . Onde é que isso String vem? É codificado ? Em seguida, basta alterá-lo se em conformidade. Será que ela vem em como a entrada do usuário ? Validá-lo e mostrar erro, permitir que o usuário resolva por si .

De qualquer forma, se você pode garantir que são apenas os espaços na URL de que o torna inválido, então você também pode simplesmente fazer um char - a-Carácter substituir por String :

+

ou uma string -by -string substituir por URI uri = new URI(string.replace(' ', '+')); :

%20

Ou se você pode garantir que ele é apenas a parte após o último corte que precisa ser codificado, então você também pode simplesmente fazer:

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

Para lidar com os espaços, @ e outros personagens inseguros em locais arbitrários no caminho de URL, use Uri.Builder em combinação com uma instância local do URL como descrevi 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();
}