Android

Android: how to parse URL String with spaces to URI object?

Android: как преобразовать строку URL с пробелами в объект URI?

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

String myString = "http://myhost.com/media/File Name that has spaces inside.mp3";
URI myUri = new URI(myString);

это дает мне

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

где индекс X - это позиция первого пробела в строке URL.

Как я могу выполнить синтаксический анализ myString в URI объекте?

Переведено автоматически
Ответ 1

На самом деле вам следует закодировать в URI "недопустимые" символы. Поскольку строка фактически содержит полный URL, ее сложно правильно закодировать в URI. Вы не знаете, какие косые черты / следует учитывать, а какие нет. Вы не можете предсказать это в raw String заранее. Проблему действительно нужно решать на более высоком уровне. Откуда это String взялось? Это жестко запрограммировано? Тогда просто измените это самостоятельно соответствующим образом. Это вводится пользователем? Подтвердите это и покажите ошибку, пусть пользователь решает сам.

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

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

Или, если вы можете убедиться, что это только часть после последней косой черты, которая должна быть закодирована в URI, то вы также можете просто сделать это с помощью android.net.Uri служебного класса:

int pos = string.lastIndexOf('/') + 1;
URI uri = new URI(string.substring(0, pos) + Uri.encode(string.substring(pos)));

Обратите внимание, что URLEncoder не подходит для этой задачи, поскольку он предназначен для кодирования имен / значений параметров строки запроса в соответствии с application/x-www-form-urlencoded правилами (используемыми в формах HTML). Смотрите также Кодировку Java URL параметров строки запроса.

Ответ 2
java.net.URLEncoder.encode(finalPartOfString, "utf-8");

Это будет URL-кодировать строку.

finalPartOfString это часть после последней косой черты - в вашем случае, название песни, как кажется.

Ответ 3

Для обработки пробелов, @ и других небезопасных символов в произвольных местах пути URL используйте Uri.Builder в сочетании с локальным экземпляром URL, как я описал здесь:

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();
}
Ответ 4
URL url = Test.class.getResource(args[0]);  // reading demo file path from                                                   
// same location where class
File input=null;
try {
input = new File(url.toURI());
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
2024-01-24 15:43 java android