Ich versuche ein java.net.URI
Objekt von einem zu bekommen String
. Die Zeichenfolge enthält einige Zeichen, die durch ihre prozentualen Escape-Sequenzen ersetzt werden müssen. Aber wenn ich URLEncoder verwende, um den String mit UTF-8-Codierung zu codieren, werden sogar die / durch ihre Escape-Sequenzen ersetzt.
Wie kann ich eine gültige codierte URL von einem String-Objekt erhalten?
http://www.google.com?q=a b gibt http% 3A% 2F% 2www.google.com ... während ich möchte, dass die Ausgabe http://www.google.com?q=a% ist 20b
Kann mir bitte jemand sagen, wie ich das erreichen kann?
Ich versuche dies in einer Android-App zu tun. Ich habe also Zugriff auf eine begrenzte Anzahl von Bibliotheken.
Android hatte schon immer die Uri-Klasse als Teil des SDK: http://developer.android.com/reference/android/net/Uri.html
Sie können einfach so etwas tun wie:
String requestURL = String.format("http://www.example.com/?a=%s&b=%s", Uri.encode("foo bar"), Uri.encode("100% fubar'd"));
quelle
Ich werde hier einen Vorschlag hinzufügen, der sich an Android-Benutzer richtet. Sie können dies tun, ohne externe Bibliotheken abrufen zu müssen. 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 können sehen, dass in dieser bestimmten URL diese Leerzeichen codiert sein 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, sodass Sie keine Arbeit zum Suchen / Ersetzen von Zeichenfolgen ausführen müssen. Zweitens nutzt dieser Ansatz die URI-Klassenfunktion, um Komponenten ordnungsgemäß zu maskieren, wenn Sie einen URI über Komponenten anstatt aus einer einzelnen Zeichenfolge erstellen.
Das Schöne an diesem Ansatz ist, dass Sie jede gültige URL-Zeichenfolge verwenden können, ohne dass Sie selbst spezielle Kenntnisse darüber benötigen.
quelle
Auch wenn dies ein alter Beitrag mit einer bereits akzeptierten Antwort ist, poste ich meine alternative Antwort, da sie für die vorliegende Ausgabe gut funktioniert und anscheinend niemand diese Methode erwähnt hat.
Mit der Bibliothek java.net.URI:
Und wenn Sie eine entsprechende URL-formatierte Zeichenfolge möchten:
Im Gegensatz zu vielen anderen Methoden (zB java.net.URLEncoder) dieses eine ersetzt nur unsichere ASCII - Zeichen (wie
ç
,é
...).Im obigen Beispiel ist if
URLString
das FolgendeString
:"http://www.domain.com/façon+word"
das Ergebnis
validURLString
wird sein:"http://www.domain.com/fa%C3%A7on+word"
Das ist eine gut formatierte URL.
quelle
'
jedoch ein sicherer Charakter . Aber"
wirft eine Ausnahme auf! Gleiches gilt für java.net.URL.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. B. nur für die Komponente "ab", während Sie die URL aufbauen. Andernfalls weiß der Computer nicht, welche Zeichen angenommen werden eine besondere Bedeutung haben und welche 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 " %$&+,/:;=?@<>#%".indexOf(ch) >= 0; }
quelle
Sie können die Konstruktoren mit mehreren Argumenten der
URI
Klasse verwenden. Aus demURI
Javadoc:Also, wenn Sie verwenden
URI uri = new URI("http", "www.google.com?q=a b");
Dann bekommen Sie,
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 das 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 sicher zu gehen, sollten Sie die Zeichenfolge nach
#
Zeichen durchsuchen , aber dies sollte Ihnen den Einstieg erleichtern.quelle
Ich hatte ähnliche Probleme bei einem meiner Projekte, 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);
quelle
http://www.google.com/Do you like Spam?
und es hat sich um die Leerzeichen gekümmert, aber nicht um das Fragezeichen am Ende)Nun, ich habe es versucht
String converted = URLDecoder.decode("toconvert","UTF-8");
Ich hoffe, das ist es, wonach Sie tatsächlich gesucht haben?
quelle
URLDecoder.decode("to convert","UTF-8")
Gibt "konvertieren" undURLDecoder.decode("to%20convert","UTF-8")
"konvertieren" zurück. Das ist also das Gegenteil von dem, was die Frage stellt.Der java.net-Blog hatte neulich eine Klasse, die vielleicht getan hat, was Sie wollen (aber sie ist momentan nicht verfügbar, sodass ich sie nicht überprüfen kann).
Dieser Code hier könnte wahrscheinlich geändert werden, um das zu tun, was Sie wollen:
http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/UriBuilder.java
Hier ist die, an die ich von java.net gedacht habe: https://urlencodedquerystring.dev.java.net/
quelle
Oder vielleicht könnten Sie diese Klasse verwenden:
http://developer.android.com/reference/java/net/URLEncoder.html
Welches ist in Android seit API Level 1 vorhanden.
Ärgerlicherweise werden Leerzeichen jedoch speziell behandelt (durch + anstelle von% 20 ersetzt). Um dies zu umgehen, verwenden wir einfach dieses Fragment:
URLEncoder.encode(value, "UTF-8").replace("+", "%20");
quelle
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:
quelle