Android'de URL kodlaması


336

Android'de bir URL'yi nasıl kodlarsınız ?

Bunun böyle olduğunu düşündüm:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);

Yukarıdakileri yaparsam, http://in urlAsStringyerine http%3A%2F%2Fin gelir encodedURLve java.net.MalformedURLExceptionURL'yi kullandığımda bir an alırım .

Yanıtlar:


630

URL'nin tamamını kodlamazsınız, yalnızca "güvenilir olmayan kaynaklardan" gelen kısımlarını kodlarsınız.

String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;

Alternatif olarak, kullanabileceğiniz Strings.urlEncode (String str) ait DroidParts işaretli istisnalar atmak değil.

Veya böyle bir şey kullanın

String uri = Uri.parse("http://...")
                .buildUpon()
                .appendQueryParameter("key", "val")
                .build().toString();

1
URL'nin tamamı güvenilir değilse ne olur? Protokol dışında her şeyi kodlamalı mıyım? Bunu yapmak için bir kolaylık yöntemi bekliyordum.
hpique

5
O zaman sadece bozuk bir url. Fikir, sorgu parçasının url'yi kırmasını önlemektir.
yanchenko

5
@hgpc - RFC3986'nın 3. bölümüne bakın ( tools.ietf.org/html/rfc3986#section-3 ). Bir URI'nin çeşitli bölümlerini nasıl kodlayacağınızı anlatır. Maalesef URI'nin her bir bölümünün (ana bilgisayar, yol, sorgu vb.) Biraz farklı kodlama kuralları vardır.
D.Shawley

2
Bu sadece bir URL'nin belirli bir kısmı ile ilgileniyor ve URL'nin nasıl oluşturulacağını veya yeniden yapılandırılacağını biliyorsunuz. Herhangi bir url dizesini ele alabilecek daha genel bir yaklaşım için aşağıdaki cevabıma bakın.
Craig B

8
Bunu kullanarak neden kullanımdan kaldırma uyarısı alıyorum? Kullanılan Uri.encode(query);yerine.
prasanthv

166

Buraya bir öneri ekleyeceğim. Bunu herhangi bir harici kitaplık almak zorunda kalmadan yapabilirsiniz.

Bunu deneyin:

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();

Bu özel URL'de, bir istek için kullanabilmem için bu boşlukların kodlanmış olması gerektiğini görebilirsiniz.

Bu, Android sınıflarında kullanabileceğiniz birkaç özellikten yararlanır. İlk olarak, URL sınıfı bir URL'yi uygun bileşenlerine ayırabilir, böylece herhangi bir dize arama / değiştirme işi yapmanız gerekmez. İkincisi, bu yaklaşım, tek bir dizeden ziyade bileşenler aracılığıyla bir URI oluşturduğunuzda, bileşenlerden düzgün kaçan URI sınıfı özelliğinden yararlanır.

Bu yaklaşımın güzelliği, herhangi bir geçerli URL dizesini alıp, kendiniz için özel bir bilgiye ihtiyaç duymadan çalışmasını sağlamanızdır.


19
Bu doğru cevap olmalı. Bu bunu yapmak için resmi ve açık bir şekilde
Asanka Senavirathna

3
URL yapıcısına göndermeden önce urlStr dosyasını urldecode etmek de iyi bir fikir olabilir. URLDecoder.decode (urlStr)
Jakob Eriksson

1
Yazı için teşekkürler :) Ama bir sorunla karşı karşıyayım. URL zaten kısmen kodlanmışsa, önceden kodlanmış parçaları kodlar. Ne yapmalıyım? Örneğin: dj-videos.us/Music/XclusiveSinGleTrack/320%20Kbps/…% 20 kodlandı% 2520
çılgına döndü

2
@berserk Zaten kodlanmışsa kodlamayın. Kısmen kodlanmış olduğu bir duruma geçmemelisiniz veya kodlanmış olup olmadığından emin değilsiniz.
Lorne'nin Marquis

3
Bu yöntem ğ gibi karakterleri% C4% 9F'ye kodlamaz. Kabul edilen bir kodlama!
Alexander Prokofyev

74

Android için String kullanıyorum android.net.Uri.encode (String s)

UTF-8 şemasını kullanarak belirli bir dizedeki karakterleri '%' olarak kodlar - çıkışlı sekizgenler. Harfleri ("AZ", "az"), sayıları ("0-9") ve kaydedilmemiş karakterleri ("_- !. ~ '() *") olduğu gibi bırakır. Diğer tüm karakterleri kodlar.

Ex /

String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);

2
Ne yazık ki Uri.encode("a=1&b=1")üretiyor a%3D1%26b%3D1ama bekleniyora=1&b=1
loentar

14
@loentar Beklenen sonuç budur. Kullanıcı a=1&b=1bir sorgu olarak girerse , tam olarak bunu sorgulamak istersiniz.
Anubian Noob

URLEncoder.encode (StringHere, "UTF-8") ile ne kadar farklı
stuckedoverflow

@stuckedoverflow Bir şey için, Uri.encode (str), URLEncoder.encode (str, "UTF-8") 'den farklı olarak kontrol edilen bir istisna
atmıyor

50

Ayrıca bunu kullanabilirsiniz

private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);

en basit yöntem


1
Bu en iyi çözüm değil, ama kesinlikle güzel bir hızlı düzeltme ... thanx
Sebastian Breit

4
URL'nin tamamı güvenilir olmadığında bu en hızlı düzeltmedir. Teşekkürler!
user1032613

% 'E izin verilmesi gerektiğinden emin misiniz? Kodlanmamalı mı?
MediumOne

1
Paylaşmak ve daha sonra kullanıcı bağlantıyı açmak ve sayfayı görmek mümkün olmak için bu url nasıl kodlanır
Ahmad Ebrahimi

3
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

1

aşağıdaki yöntemleri kullanabilirsiniz

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();
}

veya

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();
}

ikincisi ilkinden daha iyidir.


0

Arapça karakterleri bulun ve UTF-8 kodlamasıyla değiştirin. böyle bir şey:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.