2008-11-20 11 views
10

Was ist der beste Weg, URL-Strings so zu codieren, dass sie rfc2396-konform sind, und eine RFC2396-konforme Zeichenkette so zu dekodieren, dass zum Beispiel% 20 durch ein Leerzeichen ersetzt wird?URLs codieren und decodieren

edit: URLEncoder und URLDecoder Klassen tun nicht Encoder/Decoder RFC2396 konforme URLs, die sie kodieren, um einen MIME-Typen application/x-www-form-urlencoded die verwendet wird, HTML-Formularparameterdaten zu codieren.

+0

Ist das nicht application/x-www-form-urlencoded das Gleiche? –

+0

Nein, ist es nicht. RFC2396-Codierung ist nicht identisch mit Codierung für HTML-Formulardaten. – Gili

+2

Siehe http://stackoverflow.com/questions/444112/how-do-i-encode-uri-parameter-values ​​gibt es einige Antworten. –

Antwort

11

die URI-Klasse wie folgt verwenden:

URI uri = new URI("http", "//www.someurl.com/has spaces in url", null); 
URL url = uri.toURL(); 

oder wenn Sie einen String wollen:

String urlString = uri.toASCIIString();
-3
+3

Dies wird nicht funktionieren.Der URLEncoder und der URLDecoder dienen zum Codieren und Decodieren von HTML-Formulardaten trotz ihrer Namen. –

1

Die Javadocs empfehlen die Verwendung der Klasse java.net.URI, um die Codierung durchzuführen. Um sicherzustellen, dass die URI-Klasse die URL korrekt codiert, muss einer der Konstruktoren mit mehreren Argumenten verwendet werden. Diese Konstruktoren führen die erforderliche Kodierung durch, erfordern jedoch, dass Sie jede URL-Zeichenfolge in den Parametern analysieren.

Wenn Sie dekodieren möchten, müssen Sie den URI mit dem Konstruktor für einzelne Argumente konstruieren, der keine Codierung durchführt. Sie können Methoden wie getPath() usw. aufrufen, um die dekodierte URL abzurufen und zu erstellen.

+0

Die Konstruktoren mit mehreren Argumenten helfen nicht, da es nicht möglich ist, ihnen mitzuteilen, welcher Teil der Abfragezeichenfolge codiert werden soll und welcher nicht. Wir benötigen eine Methode, die einen Parameterwert aufnimmt und das URL-codierte Formular zurückgibt. – Gili

+0

Der gesamte Abfragestring muss möglicherweise abhängig davon, was er enthält, codiert werden. –

2

Ihre Komponenten, die möglicherweise Zeichen enthalten, die maskiert werden müssen, sollten bereits mit URLEncoder maskiert worden sein, bevor sie zu einem URI verkettet werden.

Wenn Sie einen URI mit Out-of-Band-Zeichen haben (wie Leerzeichen, "<> [] {} \ | ^` und Nicht-ASCII-Bytes), handelt es sich nicht wirklich um einen URI. Sie können es versuchen repariere sie, indem du sie manuell percentest, aber dies ist eine letzte Operation und keine Standardform der Kodierung Dies ist normalerweise notwendig, wenn du potentiell missgebildete URIs von Benutzereingaben akzeptierst, aber es ist kein standardisiertes Betrieb und ich kenne keine integrierte Java-Bibliothek-Funktion, die es für Sie tun wird, müssen Sie möglicherweise selbst mit einer RegExp hacken.

In die andere Richtung, müssen Sie Ihre URI auseinander in seine Bestandteile (jeder separate Pfadteil, Name und Wert des Abfrageparameters usw.), bevor Sie jedes Teil (mit einem URLDecoder) entschlüsseln können Es gibt keinen vernünftigen Weg, einen ganzen URI auf einmal zu dekodieren; Sie könnten versuchen, '% -escapes' zu dekodieren, die nicht zu Delimitern dekodieren '(wie /? = &;%), aber Sie hätten eine seltsame inkonsistente Zeichenkette, die keinem URI-Verarbeitungsstandard entspricht.

URLEncoder/URLDecoder eignen sich für die Behandlung von URI-Abfragekomponenten, sowohl Namen als auch Werte. Allerdings sind sie nicht durchaus Recht für die Handhabung von URI-Pfad Teilkomponenten. Der Unterschied ist, dass das Zeichen '+' kein Leerzeichen in einem Pfadteil bedeutet. Sie können dies mit einem einfachen String ersetzen ersetzen: Ersetzen Sie nach URLEncoding '+' durch '% 20'; Ersetzen Sie vor URLDecoding '+' durch '% 2B'. Sie können den Unterschied ignorieren, wenn Sie nicht beabsichtigen, Segmente mit Leerzeichen oder Pluszeichen in Ihren Pfad aufzunehmen.

+1

Klingt riskant. Es wäre viel sicherer, einen Encoder zu verwenden, der für RFC2396 entworfen wurde, als zu versuchen, URLEncoder in einen zu hacken. Sie könnten einen Fehler machen. – Gili

Verwandte Themen