Codifica URL in Android


336

Come si codifica un URL in Android?

Ho pensato che fosse così:

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

Se faccio quanto sopra, http://in urlAsStringviene sostituito da http%3A%2F%2Fin encodedURLe quindi ottengo un java.net.MalformedURLExceptionquando uso l'URL.

Risposte:


630

Non codifichi l'intero URL, ma solo parti di esso che provengono da "fonti inaffidabili".

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

In alternativa, puoi utilizzare Strings.urlEncode (String str) di DroidParts che non genera eccezioni verificate.

O usa qualcosa di simile

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

1
Cosa succede se l'intero URL non è affidabile? Dovrei codificare tutto tranne il protocollo? Mi aspettavo un metodo pratico per farlo.
hpique,

5
Quindi è solo un URL rotto. L'idea è di impedire alla parte della query di interrompere l'URL.
yanchenko,

5
@hgpc - dai un'occhiata alla sezione 3 di RFC3986 ( tools.ietf.org/html/rfc3986#section-3 ). Ti dice come codificare le varie porzioni di un URI. Sfortunatamente ogni porzione dell'URI (host, percorso, query, ecc.) Ha regole di codifica leggermente diverse.
D.Shawley,

2
Questo va bene perché hai a che fare con una parte specifica di un URL e sai come costruire o ricostruire l'URL. Per un approccio più generale in grado di gestire qualsiasi stringa di URL, vedere la mia risposta di seguito.
Craig B,

8
Perché sto ricevendo un avviso di deprecazione usando questo? Usato Uri.encode(query);invece.
prasanthv,

166

Ho intenzione di aggiungere un suggerimento qui. Puoi farlo, evitando così di avere librerie esterne.

Prova questo:

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

Puoi vedere che in questo particolare URL, devo avere quegli spazi codificati in modo da poterlo usare per una richiesta.

Questo sfrutta un paio di funzionalità disponibili per te nelle lezioni Android. Innanzitutto, la classe URL può suddividere un URL nei relativi componenti, quindi non è necessario eseguire alcuna ricerca / sostituzione di stringhe. In secondo luogo, questo approccio sfrutta la funzionalità della classe URI di componenti con escape corretto quando si costruisce un URI tramite componenti anziché da una singola stringa.

La bellezza di questo approccio è che puoi prendere qualsiasi stringa di URL valida e farla funzionare senza bisogno di alcuna conoscenza speciale di te.


19
Questa dovrebbe essere la risposta corretta. questo è il modo formale e chiaro per farlo
Asanka Senavirathna,

3
Può anche essere una buona idea urldecode urlStr prima di inviarlo al costruttore dell'URL. URLDecoder.decode (urlStr)
Jakob Eriksson,

1
Grazie per il post :) Ma sto affrontando un problema. Se l'URL è già parzialmente codificato, sta codificando le parti già codificate. Cosa dovrei fare? Ad esempio: dj-videos.us/Music/XclusiveSinGleTrack/320%20Kbps/…% 20 è codificato in% 2520
berserk

2
@berserk Se è già codificato, non codificarlo. Non dovresti entrare in uno stato in cui è parzialmente codificato o non sei sicuro che sia o meno codificato.
Marchese di Lorne,

3
Questo metodo non codifica caratteri come ğ in% C4% 9F. Uno accettato codifica!
Alexander Prokofyev,

74

Per Android, userei String android.net.Uri.encode (String s)

Codifica i caratteri nella stringa specificata come '%' - ottetti con escape utilizzando lo schema UTF-8. Lascia intatte le lettere ("AZ", "az"), i numeri ("0-9") e i caratteri senza prenotazione ("_- !. ~ '() *"). Codifica tutti gli altri personaggi.

Ex/

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

2
Sfortunatamente Uri.encode("a=1&b=1")produce a%3D1%26b%3D1ma previstoa=1&b=1
loentar il

14
@loentar Questo è il risultato atteso. Se l'utente inserisce a=1&b=1una query, si desidera eseguire una query esattamente.
Anubian Noob,

Quanto è diverso con URLEncoder.encode (StringHere, "UTF-8")
stuckedoverflow

@stuckedoverflow Per prima cosa, Uri.encode (str) non genera un'eccezione controllata a differenza di URLEncoder.encode (str, "UTF-8")
deekshith

50

Inoltre puoi usare questo

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

è il metodo più semplice


1
questa non è la soluzione migliore, ma è sicuramente una bella soluzione rapida ... grazie
Sebastian Breit

4
Questa è la soluzione più rapida quando l'intero URL non è affidabile. Grazie!
user1032613

Sei sicuro che la% dovrebbe essere consentita? Non dovrebbe essere codificato?
Medio: un

1
Come codificare questo URL per poterlo condividere e quindi l'utente può aprire il link e vedere la pagina: yazd20.com//News/2015/11/ استند-آب-كمدي-حسن-ريوندي-در-يزد. Html
Ahmad Ebrahimi,

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

1

puoi usare i metodi seguenti

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

o

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

il secondo è migliore del primo.


0

Trova i caratteri arabi e sostituiscili con la sua codifica UTF-8. qualcosa come questo:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.