Кодировка URL в Android
Как вы кодируете URL в Android?
Я думал, что это было так:
final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);
Если я сделаю выше, то http://
в urlAsString
заменяется http%3A%2F%2F
в encodedURL
а потом я получаю java.net.MalformedURLException
когда я использую URL.
6 ответов
Вы не кодируете весь URL, а только его части, полученные из "ненадежных источников".
String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackru.com/search?q=" + query;
Кроме того, вы можете использовать Strings.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 я бы использовал String android.net.Uri.encode(String s)
Кодирует символы в заданной строке как "%" - экранированные октеты по схеме UTF-8. Оставляет буквы ("AZ", "az"), цифры ("0-9") и незарезервированные символы ("_-!.~'()*") без изменений. Кодирует все остальные символы.
Ex /
String urlEncoded = "http://stackru.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();
}
второй лучше первого
Найдите арабские символы и замените их кодировкой UTF-8. что-то вроде этого:
for (int i = 0; i < urlAsString.length(); i++) {
if (urlAsString.charAt(i) > 255) {
urlAsString = urlAsString.substring(0, i) + URLEncoder.encode(urlAsString.charAt(i)+"", "UTF-8") + urlAsString.substring(i+1);
}
}
encodedURL = urlAsString;
Обязательно используйте попробуйте... поймать. Если нет, то это не удастся.