Android : с практическими рекомендациями разбора URL строки с пробелами в объект URI ?

? Mannaz @ | Original: StackOverFlow

У меня есть строка, представляющая URL содержит пробелы и хочу, чтобы преобразовать его в объект URI. Если просто попытка сделать

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

где индекс X являетсяпозиция первого места в строке адреса .

Как я могу разобрать myString вURI возражать?

Top 5 ответ

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

Это http://www.w3schools.com/TAGS/ref_urlencode.asp строку .

finalPartOfString Являетсячастью после последнего слеша - в вашем случае,название песни, как кажется.

2BalusC @

Вы должны на самом деле http://java.sun.com/javase/6/docs/api/java/net/URLEncoder.htmlhttp://en.wikipedia.org/wiki/Percent-encoding . Сцепочка фактически содержит полный URL, трудно правильно URL -кодирование он . Вы не знаете, какой сокращает URLEncode должны быть приняты во внимание, и которые нет. Вы не можете предсказать, что насырье / заранее . Проблема действительно нужно решать на более высоком уровне . Где это String взялось? Это жестко ? Тогда просто изменить его самостоятельно, соответственно . Она приходит в качестве входных данных пользователя ? Подтвердить его и показать ошибку, пустьпользователь сам решить .

В любом случае, если вы можете гарантировать, что это только пробелы в URL, что делает его недействительным, то вы также можете просто сделатьсимвол - на - обугливается заменить String :

+

илистрока - на - строки заменить URI uri = new URI(string.replace(' ', '+')); :

%20

Или, если вы можете гарантировать, что это толькочасть послепоследнего слеша, который должен быть закодирован, то вы также можете просто сделать:

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

Чтобы справиться с пробелы, @ и другие небезопасные символы в произвольных местах на пути URL, использования Uri.Builder в сочетании с локального экземпляра URL как я описал 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();
}