wake-up-neo.com

Java - Konvertieren Sie den String in ein gültiges URI-Objekt

Ich versuche, ein Java.net.URI-Objekt von einer String zu erhalten. Die Zeichenfolge enthält einige Zeichen, die durch ihre prozentuale Escape-Sequenz ersetzt werden müssen. Wenn ich jedoch URLEncoder zum Codieren des Strings mit UTF-8-Codierung verwende, werden sogar die/durch ihre Escape-Sequenzen ersetzt.

Wie kann ich eine gültige codierte URL aus einem String-Objekt erhalten?

http://www.google.com?q=a b gibt http% 3A% 2F% 2www.google.com ... an. Ich möchte, dass die Ausgabe ist. http://www.google.com?q=a%20b

Kann mir bitte jemand sagen, wie ich das erreichen kann.

Ich versuche dies in einer Android-App. So habe ich Zugriff auf eine begrenzte Anzahl von Bibliotheken.

69
lostInTransit

Sie könnten Folgendes versuchen: org.Apache.commons.httpclient.util.URIUtil.encodeQuery in Apache commons-httpclient project

So (siehe URIUtil ):

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

wird werden:

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

Sie können es natürlich selbst tun, aber das Analysieren von URIs kann ziemlich chaotisch werden ...

55
Hans Doggen

Android hatte immer die Uri-Klasse im SDK: http://developer.Android.com/reference/Android/net/Uri.html

Sie können einfach so etwas tun:

String requestURL = String.format("http://www.example.com/?a=%s&b=%s", Uri.encode("foo bar"), Uri.encode("100% fubar'd"));
45
bensnider

Ich werde hier einen Vorschlag hinzufügen, der sich an Android-Benutzer richtet. Sie können dies tun, um zu vermeiden, dass Sie externe Bibliotheken benötigen. Außerdem sind alle in einigen der obigen Antworten vorgeschlagenen Lösungen zum Suchen/Ersetzen von Zeichen gefährlich und sollten vermieden werden. 

Probieren Sie es aus:

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

Sie sehen, dass in dieser URL diese Leerzeichen codiert werden müssen, damit ich sie für eine Anfrage verwenden kann. 

Dies nutzt einige Funktionen, die Ihnen in Android-Klassen zur Verfügung stehen. Erstens kann die URL-Klasse eine URL in ihre richtigen Komponenten aufteilen, so dass Sie keine Suche nach Zeichenfolgen durchführen müssen. Zweitens nutzt dieser Ansatz das URI-Klassenfeature, um Komponenten ordnungsgemäß zu umgehen, wenn Sie einen URI über Komponenten und nicht aus einer einzelnen Zeichenfolge erstellen.

Das Schöne an diesem Ansatz ist, dass Sie eine beliebige gültige URL-Zeichenfolge verwenden können, ohne dass hierfür spezielle Kenntnisse erforderlich sind. 

33
Craig B

Auch wenn dies ein alter Beitrag mit einer bereits akzeptierten Antwort ist, poste ich meine alternative Antwort, da dies für die vorliegende Ausgabe gut funktioniert und es scheint, dass niemand diese Methode erwähnt hat.

Mit der Java.net.URI-Bibliothek:

URI uri = URI.create(URLString);

Und wenn Sie eine URL-formatierte Zeichenfolge haben möchten:

String validURLString = uri.toASCIIString();

Im Gegensatz zu vielen anderen Methoden (z. B. Java.net.URLEncoder) ersetzt diese nur unsichere ASCII Zeichen (wie ç, é...).


Wenn im obigen Beispiel URLString die folgende String ist:

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

die resultierende validURLString wird sein:

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

dies ist eine gut formatierte URL.

14
dgiugg

Wenn Sie keine Bibliotheken mögen, wie wäre es damit?

Beachten Sie, dass Sie diese Funktion nicht für die gesamte URL verwenden sollten, sondern für die Komponenten ... z. Nur die "a b" -Komponente, wenn Sie die URL aufbauen - sonst weiß der Computer nicht, welche Zeichen eine besondere Bedeutung haben sollen und welche Zeichen eine wörtliche Bedeutung haben sollen.

/** 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 " %$&+,/:;[email protected]<>#%".indexOf(ch) >= 0;
}
9
Tim Cooper

Sie können die Konstruktoren mit mehreren Argumenten der Klasse URI verwenden. Aus der URI-Javadoc:

Die Konstruktoren mit mehreren Argumenten geben unzulässige Zeichen an, je nach den Komponenten, in denen sie enthalten sind. Das Prozentzeichen ('%') wird immer von diesen Konstruktoren angegeben. Alle anderen Zeichen bleiben erhalten.

Also wenn du verwendest

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

Dann bekommt man http:www.google.com?q=a%20b was nicht ganz richtig ist, aber es ist ein bisschen näher.

Wenn Sie wissen, dass Ihre Zeichenfolge keine URL-Fragmente enthält (z. B. http://example.com/page#anchor ), können Sie den folgenden Code verwenden, um zu erhalten, was Sie möchten:

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

Um sicherzugehen, sollten Sie die Zeichenfolge nach #-Zeichen scannen, aber dies sollte Ihnen den Einstieg erleichtern.

4
Jason Day

Ich hatte ähnliche Probleme bei einem meiner Projekte, um ein URI-Objekt aus einer Zeichenfolge zu erstellen. Ich konnte auch keine saubere Lösung finden. Folgendes habe ich mir ausgedacht:

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

Sie können stattdessen den folgenden URI-Konstruktor verwenden, um bei Bedarf einen Port anzugeben:

URI uri = new URI(scheme, userInfo, Host, port, path, query, fragment);
4
Hervé Donner

Nun, ich habe es versucht 

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

Ich hoffe, das war es, wonach Sie gesucht haben?

3
Amol Ghotankar

Oder vielleicht könnten Sie diese Klasse verwenden:

http://developer.Android.com/reference/Java/net/URLEncoder.html

Welche in Android seit API-Ebene 1 vorhanden ist.

Es ist jedoch ärgerlich, wenn Leerzeichen speziell behandelt werden (indem sie durch + anstelle von% 20 ersetzt werden). Um dies zu umgehen, verwenden wir einfach dieses Fragment:

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

1
MrCranky

Der Java.net-Blog hatte neulich eine Klasse, die vielleicht getan hat, was Sie wollen (aber es ist im Moment nicht verfügbar, daher kann ich es nicht überprüfen). 

Dieser Code hier könnte möglicherweise geändert werden, um das zu tun, was Sie möchten:

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

Hier ist der, an den ich von Java.net nachgedacht habe: https://urlencodedquerystring.dev.Java.net/

1
TofuBeer

Am Ende habe ich den httpclient-4.3.6 verwendet:

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

Ausgabe wird sein:

http://www.example.com/somepage.php?username=Hello+G%C3%BCnter&p1=paramter+1