Кодировка URL в Android
как вы кодируете a URL в Android?
Я думал, что это было так:
final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);
если я сделаю выше, то http://
in urlAsString
заменить на http%3A%2F%2F
на encodedURL
и тогда я получаю java.net.MalformedURLException
когда я использую URL.
6 ответов:
вы не кодируете весь URL, только его части, которые поступают из"ненадежных источников".
String query = URLEncoder.encode("apples oranges", "utf-8"); String url = "http://stackoverflow.com/search?q=" + query;
кроме того, вы можете использовать строки.urlEncode (String str) на DroidParts это не бросает проверенные исключения.
или использовать что-то вроде
String uri = Uri.parse("http://...") .buildUpon() .appendQueryParameter("key", "val") .build().toString();
Я собираюсь добавить одно предложение здесь. Вы можете сделать это, что позволяет избежать необходимости получать какие-либо внешние библиотеки.
дайте этому попытку:
String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4"; URL url = new URL(urlStr); URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); url = uri.toURL();
вы можете видеть, что в этом конкретном URL-адресе мне нужно закодировать эти пробелы, чтобы я мог использовать его для запроса.
Это использует несколько функций, доступных для вас в классах Android. Во-первых, класс URL может разбить url на соответствующие компоненты, поэтому вам не нужно ничего делать строка поиска / замены работы. Во-вторых, этот подход использует функцию класса URI правильного экранирования компонентов при создании URI через компоненты, а не из одной строки.
красота этого подхода заключается в том, что вы можете взять любую допустимую строку URL и он будет работать без каких-либо специальных знаний об этом самостоятельно.
для android, я бы использовал Строка андроида.чистая.Ури.кодирование(строка s)
кодирует символы в данной строке как '% ' - экранированные октеты, используя схему UTF-8. Оставляет буквы ("A-Z"," a-z"), цифры ("0-9") и незащищенные символы ("_ -!.~'()*") нетронутый. Кодирует все остальные символы.
Ex/
String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
также вы можете использовать этот
private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%"; String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
Это самый простой способ
try { query = URLEncoder.encode(query, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
вы можете использовать следующие методы
public static String parseUrl(String surl) throws Exception { URL u = new URL(surl); return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString(); }
или
public String parseURL(String url, Map<String, String> params) { Builder builder = Uri.parse(url).buildUpon(); for (String key : params.keySet()) { builder.appendQueryParameter(key, params.get(key)); } return builder.build().toString(); }
второй лучше, чем первый.