Android: how to parse URL String with spaces to URI object?
Android: как преобразовать строку URL с пробелами в объект URI?
У меня есть строка, представляющая URL, содержащий пробелы, и я хочу преобразовать ее в объект URI. Если я просто попытаюсь создать ее через
StringmyString="http://myhost.com/media/File Name that has spaces inside.mp3"; URImyUri=newURI(myString);
это дает мне
java.net.URISyntaxException: Illegal character in path at index X
где индекс X - это позиция первого пробела в строке URL.
Как я могу выполнить синтаксический анализ myString в URI объекте?
Переведено автоматически
Ответ 1
На самом деле вам следует закодировать в URI "недопустимые" символы. Поскольку строка фактически содержит полный URL, ее сложно правильно закодировать в URI. Вы не знаете, какие косые черты / следует учитывать, а какие нет. Вы не можете предсказать это в raw String заранее. Проблему действительно нужно решать на более высоком уровне. Откуда это String взялось? Это жестко запрограммировано? Тогда просто измените это самостоятельно соответствующим образом. Это вводится пользователем? Подтвердите это и покажите ошибку, пусть пользователь решает сам.
В любом случае, если вы можете убедиться, что это только пробелы в URL, которые делают его недействительным, тогда вы также можете просто выполнить замену строки за строкой на %20:
URIuri=newURI(string.replace(" ", "%20"));
Или, если вы можете убедиться, что это только часть после последней косой черты, которая должна быть закодирована в URI, то вы также можете просто сделать это с помощью android.net.Uri служебного класса:
Обратите внимание, что URLEncoder не подходит для этой задачи, поскольку он предназначен для кодирования имен / значений параметров строки запроса в соответствии с application/x-www-form-urlencoded правилами (используемыми в формах HTML). Смотрите также Кодировку Java URL параметров строки запроса.
finalPartOfString это часть после последней косой черты - в вашем случае, название песни, как кажется.
Ответ 3
Для обработки пробелов, @ и других небезопасных символов в произвольных местах пути URL используйте Uri.Builder в сочетании с локальным экземпляром URL, как я описал здесь:
private Uri.Builder builder; public Uri getUriFromUrl(String thisUrl) { URLurl=newURL(thisUrl); builder = newUri.Builder() .scheme(url.getProtocol()) .authority(url.getAuthority()) .appendPath(url.getPath()); return builder.build(); }
Ответ 4
URLurl= Test.class.getResource(args[0]); // reading demo file path from // same location where class File input=null; try { input = newFile(url.toURI()); } catch (URISyntaxException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }