825 Stimmen

Java-URL-Kodierung von Query-String-Parametern

Angenommen, ich habe eine URL

http://example.com/query?q=

und ich habe eine vom Benutzer eingegebene Abfrage wie z.B.:

Zufallswort £500 Bank $

Ich möchte, dass das Ergebnis eine korrekt kodierte URL ist:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

Wie kann man das am besten erreichen? Ich habe versucht URLEncoder und die Erstellung von URI/URL-Objekten, aber keines davon ist wirklich gut gelungen.

1335voto

BalusC Punkte 1034465

URLEncoder ist der richtige Weg. Sie müssen nur darauf achten, dass die Kodierung sólo der Name und/oder der Wert des einzelnen Query-String-Parameters, nicht die gesamte URL und schon gar nicht das Trennzeichen des Query-String-Parameters & noch das Trennzeichen zwischen Name und Wert des Parameters = .

String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);

Wenn Sie immer noch kein Java 10 oder neuer haben, dann verwenden Sie StandardCharsets.UTF_8.toString() als Zeichensatzargument, oder wenn Sie noch nicht mit Java 7 oder neuer arbeiten, dann verwenden Sie "UTF-8" .


Beachten Sie, dass Leerzeichen in Abfrageparametern durch + , nicht %20 die rechtmäßig gültig ist. Die %20 wird in der Regel verwendet, um Leerzeichen im URI selbst darzustellen (der Teil vor dem URI-Abfragezeichentrennzeichen ? ), nicht im Query-String (der Teil nach ? ).

Beachten Sie auch, dass es drei encode() Methoden. Eine ohne Charset als zweites Argument und ein weiteres mit String als zweites Argument, das eine geprüfte Ausnahme auslöst. Diejenige ohne Charset Argument ist veraltet. Verwenden Sie es niemals und geben Sie immer das Charset Argument. Die Website javadoc empfiehlt sogar ausdrücklich die Verwendung der Kodierung UTF-8, wie sie von RFC3986 y W3C .

Alle anderen Zeichen sind unsicher und werden zunächst mit Hilfe eines Kodierungsschemas in ein oder mehrere Bytes umgewandelt. Dann wird jedes Byte durch die dreistellige Zeichenfolge "%xy" dargestellt, wobei xy die zweistellige hexadezimale Darstellung des Bytes ist. Das empfohlene Kodierungsschema ist UTF-8 . Wird jedoch aus Kompatibilitätsgründen keine Kodierung angegeben, so wird die Standardkodierung der Plattform verwendet.

Siehe auch:

115voto

M Abdul Sami Punkte 1465

Sie müssen zunächst einen URI erstellen wie:

String urlStr = "http://www.example.com/CEREC® Materials & Accessories/IPS Empress® CAD.pdf"
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());

Konvertieren Sie dann diesen URI in eine ASCII-Zeichenfolge:

urlStr = uri.toASCIIString();

Jetzt ist Ihre URL-Zeichenfolge vollständig kodiert. Zuerst haben wir einfach URL-Kodierung und dann in eine ASCII-Zeichenkette umgewandelt, um sicherzustellen, dass kein Zeichen außerhalb von US-ASCII in der Zeichenkette bleibt. Genau so machen es die Browser.

37voto

Emmanuel Touzery Punkte 8370

Guave 15 hat jetzt hinzugefügt eine Reihe unkomplizierter URL-Escaper .

9voto

jschnasse Punkte 6745

Der Code

URL url = new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL = uri.toASCIIString();
System.out.println(correctEncodedURL);

Drucke

http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$

Was ist hier los?

1. URL in strukturelle Teile aufteilen. Verwenden Sie java.net.URL für sie.

2. Codieren Sie jedes Strukturteil richtig!

3. Verwenden Sie IDN.toASCII(putDomainNameHere) a Punycode den Hostnamen verschlüsseln!

4. Verwenden Sie java.net.URI.toASCIIString() a Prozent-Codierung NFC kodierter Unicode - (besser wäre NFKC!). Für weitere Informationen, siehe: Wie kodiere ich diese URL richtig?

In einigen Fällen ist es ratsam prüfen, ob die URL bereits kodiert ist . Ersetzen Sie auch '+'-kodierte Leerzeichen durch '%20'-kodierte Leerzeichen.

Hier sind einige Beispiele, die auch richtig funktionieren

{
      "in" : "http://.com/",
     "out" : "http://xn--mgba3gch31f.com/"
},{
     "in" : "http://www.example.com//foo",
     "out" : "http://www.example.com/%E2%80%A5/foo"
},{
     "in" : "http://search.barnesandnoble.com/booksearch/first book.pdf",
     "out" : "http://search.barnesandnoble.com/booksearch/first%20book.pdf"
}, {
     "in" : "http://example.com/query?q=random word £500 bank $",
     "out" : "http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$"
}

Die Lösung besteht etwa 100 der Testfälle, die von Web-Plattform-Tests .

7voto

Sashi Punkte 1777

En Apache HttpKomponenten Bibliothek bietet eine elegante Option für die Erstellung und Kodierung von Abfrageparametern.

Mit HttpComponents 4.x verwenden:

URLEncodedUtils

Für HttpClient 3.x verwenden:

EncodingUtil

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X