Java - Převést řetězec na platný objekt URI

hlasů
68

Snažím se získat java.net.URIobjekt od a String. Řetězec má některé znaky, které budou muset být nahrazeny jejich procentního sekvence escape. Ale když jsem použít URLEncoder zakódovat řetězec kódování UTF-8, i / jsou nahrazeny jejich sekvence escape.

Jak mohu získat platnou kódované URL z objektu String?

http://www.google.com?q=a b dává http% 3A% 2F% 2www.google.com ... zatímco já chci výstup být http://www.google.com?q=a% 20b

Může mi někdo prosím, řekněte mi, jak toho dosáhnout.

Snažím se to dělat v aplikaci pro Android. Takže mám přístup k omezenému počtu knihoven.

Položena 21/02/2009 v 16:07
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
55

Můžete zkusit: org.apache.commons.httpclient.util.URIUtil.encodeQueryv Apache Commons-httpclient projektu

Takto (viz URIUtil ):

URIUtil.encodeQuery("http://www.google.com?q=a b")

bude:

http://www.google.com?q=a%20b

Samozřejmě si můžete udělat sami, ale URI rozebrat je dost chaotický ...

Odpovězeno 21/02/2009 v 16:26
zdroj uživatelem

hlasů
45

Android byl vždy třídu Uri jako součást sady SDK: http://developer.android.com/reference/android/net/Uri.html

Můžete jednoduše udělat něco jako:

String requestURL = String.format("http://www.example.com/?a=%s&b=%s", Uri.encode("foo bar"), Uri.encode("100% fubar'd"));
Odpovězeno 07/04/2011 v 16:21
zdroj uživatelem

hlasů
33

Chystám se přidat jeden návrh sem zaměřený na uživatele Android. Tento které vyhýbá se muset dostat žádné externí knihovny, kterou můžete udělat. Také, všechny hledání / nahradit znaky řešení navržená v některé z odpovědí výše, jsou nebezpečné a je třeba se vyhnout.

Dej to zkusit:

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

Můžete vidět, že v tomto konkrétním URL, musím mít tyto prostory kódovány tak, že bych ji použít pro žádost.

To využívá pár funkcí, které máte k dispozici ve třídách Android. První třída URL může zlomit url do svých správných komponent, takže není třeba, abyste něco vyhledejte řetězec / nahradit práci. Za druhé, tento přístup využívá třídní funkce URI správně úniku složek při konstrukci URI pomocí složek spíše než z jediného řetězce.

Krása tohoto přístupu je, že si můžete vzít jakýkoli platný url řetězec a mají fungovat bez nutnosti žádné speciální znalosti o tom sami.

Odpovězeno 22/01/2012 v 18:02
zdroj uživatelem

hlasů
14

Dokonce i když se jedná o starý příspěvek s již přijatou odpověď, jsem po mé alternativní odpověď, protože to funguje dobře pro tento problém a zdá se, nikdo zmínil tuto metodu.

S knihovnou java.net.URI:

URI uri = URI.create(URLString);

A chcete-li řetězec URL ve formátu odpovídá to:

String validURLString = uri.toASCIIString();

Na rozdíl od mnoha jiných metod (např java.net.URLEncoder) tentokrát nahradí pouze nebezpečné znaky ASCII (například ç, é...).


Ve výše uvedeném příkladu, pokud URLStringje následující String:

"http://www.domain.com/façon+word"

Výsledné validURLStringbude:

"http://www.domain.com/fa%C3%A7on+word"

což je dobře formátovaný URL.

Odpovězeno 06/08/2014 v 14:54
zdroj uživatelem

hlasů
9

Pokud se vám nelíbí, knihovny, jak se o to?

Všimněte si, že byste neměli používat tuto funkci na celý URL, místo toho byste měli použít na součásti ... tedy například jen „ab“ složka, jak si vybudovat URL - v opačném případě počítač nebude vědět, jaké znaky mají mají zvláštní význam a které z nich mají mít doslovný význam.

/** Converts a string into something you can safely insert into a URL. */
public static String encodeURIcomponent(String s)
{
    StringBuilder o = new StringBuilder();
    for (char ch : s.toCharArray()) {
        if (isUnsafe(ch)) {
            o.append('%');
            o.append(toHex(ch / 16));
            o.append(toHex(ch % 16));
        }
        else o.append(ch);
    }
    return o.toString();
}

private static char toHex(int ch)
{
    return (char)(ch < 10 ? '0' + ch : 'A' + ch - 10);
}

private static boolean isUnsafe(char ch)
{
    if (ch > 128 || ch < 0)
        return true;
    return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
}
Odpovězeno 26/07/2010 v 08:07
zdroj uživatelem

hlasů
4

Měl jsem podobné problémy pro jeden z mých projektů, jak vytvořit objekt URI z řetězce. Nemohl jsem najít žádné čisté řešení a to buď. Tady je to, co jsem přišel s:

public static URI encodeURL(String url) throws MalformedURLException, URISyntaxException  
{
    URI uriFormatted = null; 

    URL urlLink = new URL(url);
    uriFormatted = new URI("http", urlLink.getHost(), urlLink.getPath(), urlLink.getQuery(), urlLink.getRef());

    return uriFormatted;
}

Můžete použít následující URI konstruktor místo specifikovat port v případě potřeby:

URI uri = new URI(scheme, userInfo, host, port, path, query, fragment);
Odpovězeno 19/01/2012 v 21:47
zdroj uživatelem

hlasů
4

Můžete použít více argumentů konstruktérů na URItřídě. Z URIjavadoc:

Multi-argument, konstruktéři citovat nepovolené znaky, jak to vyžaduje komponenty, v nichž se objevují. Procento znak ( ‚%‘) je vždy citován těmito výrobci. Všechny ostatní znaky jsou zachovány.

Takže pokud používáte

URI uri = new URI("http", "www.google.com?q=a b");

Pak dostanete http:www.google.com?q=a%20bcož není úplně v pořádku, ale je to trochu blíž.

Pokud víte, že váš řetězec nebude mít fragmenty adresy URL (např http://example.com/page#anchor ), pak můžete použít následující kód, aby to, co chcete:

String s = "http://www.google.com?q=a b";
String[] parts = s.split(":",2);
URI uri = new URI(parts[0], parts[1], null);

Chcete-li být v bezpečí, měli byste scan řetězec #znaků, ale mělo by to dostat jste začali.

Odpovězeno 21/02/2009 v 16:41
zdroj uživatelem

hlasů
3

No Snažil jsem se pomocí

String converted = URLDecoder.decode("toconvert","UTF-8");

Doufám, že to je to, co jste vlastně hledáte?

Odpovězeno 12/07/2012 v 09:22
zdroj uživatelem

hlasů
1

Nebo možná byste mohli použít tuto třídu:

http://developer.android.com/reference/java/net/URLEncoder.html

Který je přítomen v Android od úrovně API 1.

Nechutně však zachází prostory speciálně (jejich nahrazení + namísto% 20). Chcete-li obejít toto jednoduše použít tento fragment:

URLEncoder.encode(value, "UTF-8").replace("+", "%20");

Odpovězeno 12/01/2011 v 21:15
zdroj uživatelem

hlasů
1

Java.net blog měl třídu druhý den, který mohl udělat to, co chcete (ale to je až teď, takže nemohu zkontrolovat).

Tento kód zde by mohlo být pravděpodobně dělat to, co chcete modifikovat:

http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/UriBuilder.java

Zde je ten, který jsem měl na mysli z java.net: https://urlencodedquerystring.dev.java.net/

Odpovězeno 21/02/2009 v 17:04
zdroj uživatelem

hlasů
0

Skončil jsem s použitím httpclient-4.3.6:

import org.apache.http.client.utils.URIBuilder;
public static void main (String [] args) {
    URIBuilder uri = new URIBuilder();
    uri.setScheme("http")
    .setHost("www.example.com")
    .setPath("/somepage.php")
    .setParameter("username", "Hello Günter")
    .setParameter("p1", "parameter 1");
    System.out.println(uri.toString());
}

Výstup bude:

http://www.example.com/somepage.php?username=Hello+G%C3%BCnter&p1=paramter+1
Odpovězeno 12/02/2015 v 04:51
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more