Ich erwarte
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
zur Ausgabe:
Hello%20World
(20 ist ASCII-Hex-Code für Leerzeichen)
Was ich jedoch bekomme, ist:
Hello+World
Benutze ich die falsche Methode? Was ist die richtige Methode, die ich verwenden sollte?
Antworten:
Dies verhält sich wie erwartet. Das
URLEncoder
implementiert die HTML-Spezifikationen zum Codieren von URLs in HTML-Formularen.Aus den Javadocs :
und aus der HTML-Spezifikation :
Sie müssen es ersetzen, zB:
quelle
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Ein Leerzeichen wird
%20
in URLs und in+
in Formularen übermittelten Daten codiert (Inhaltstyp application / x-www-form-urlencoded). Du brauchst das erstere.Verwenden von Guave :
Sie können UrlEscapers verwenden :
Verwenden Sie String.replace nicht, dies würde nur den Speicherplatz codieren. Verwenden Sie stattdessen eine Bibliothek.
quelle
Diese Klasse führt
application/x-www-form-urlencoded
eher eine Codierung vom Typ als eine prozentuale Codierung durch, daher ist das Ersetzendurch
+
ein korrektes Verhalten.Aus Javadoc:
quelle
url
sollte der Raum als interpretiert werden%20
. Also müssen wir tunurl.replaceAll("\\+", "%20")
? Und wenn es Javascript ist, sollten wir keineescape
Funktion verwenden. Verwenden SieencodeURI
oderencodeURIComponent
stattdessen. Das ist was ich dachte.Abfrageparameter codieren
ODER wenn Sie Zeichen innerhalb der URI umgehen möchten
quelle
org.apache.commons.httpclient.util.URIUtil
scheint der effizienteste Weg zu sein, um das Problem zu lösen!Hello+World
Auf diese Weise codiert ein Browser Formulardaten (application/x-www-form-urlencoded
) für eineGET
Anforderung. Dies ist das allgemein akzeptierte Formular für den Abfrageteil einer URI.Wenn Sie diese Anforderung an ein Java-Servlet senden, dekodiert das Servlet den Parameterwert korrekt. Normalerweise treten hier nur dann Probleme auf, wenn die Codierung nicht übereinstimmt.
Genau genommen ist in den HTTP- oder URI-Spezifikationen nicht erforderlich, dass der Abfrageteil mithilfe von
application/x-www-form-urlencoded
Schlüssel-Wert-Paaren codiert wird. Der Abfrageteil muss nur die Form haben, die der Webserver akzeptiert. In der Praxis ist dies wahrscheinlich kein Problem.Es wäre im Allgemeinen falsch, diese Codierung für andere Teile des URI (z. B. den Pfad) zu verwenden. In diesem Fall sollten Sie das in RFC 3986 beschriebene Codierungsschema verwenden .
Mehr hier .
quelle
Die anderen Antworten enthalten entweder einen manuellen String-Ersatz, URLEncoder, der tatsächlich für das HTML-Format codiert, Apaches aufgegebenes URIUtil oder die Verwendung von Guavas UrlEscapers . Der letzte ist in Ordnung, außer dass er keinen Decoder bietet.
Apache Commons Lang bietet den URLCodec , der gemäß dem URL-Format rfc3986 codiert und decodiert .
Wenn Sie Spring bereits verwenden, können Sie auch die UriUtils- Klasse verwenden.
quelle
"+" ist richtig. Wenn Sie wirklich% 20 benötigen, ersetzen Sie die Plusses anschließend selbst.
quelle
+
Zeichen im Originaltext soll als codiert sein%2B
.+
das richtig ist, ohne den Kontext zu kennen, ist zumindest pedantisch. Abgestimmt. Lesen Sie andere Antworten, um zu erfahren, wann + oder% 20 verwendet werden sollen.Das hat bei mir funktioniert
quelle
Ich habe gerade auch auf Android damit zu kämpfen gehabt und es geschafft, auf Uri.encode (String, String) zu stoßen, während Android (android.net.Uri) für einige nützlich sein könnte.
statische String-Codierung (String s, String erlauben)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
quelle
Obwohl ziemlich alt, dennoch eine schnelle Antwort:
Spring bietet UriUtils - hier können Sie angeben, wie codiert werden soll und welcher Teil von einem URI stammt, z
Ich benutze sie, weil wir bereits Spring verwenden, dh es ist keine zusätzliche Bibliothek erforderlich!
quelle
Schauen Sie sich die Klasse java.net.URI an.
quelle
Ja, diese Methode java.net.URLEncoder.encode wurde nicht für die Konvertierung von "" in "20%" gemäß Spezifikation ( Quelle ) erstellt.
Auch wenn dies nicht die richtige Methode ist, können Sie dies ändern, um:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
einen schönen Tag zu haben =).quelle
URLEncoder.encode
), und sie mit einer Methode zu patchen,replaceAll
die nur in diesem speziellen Fall funktioniert. Verwenden Sie stattdessen die richtige Klasse und Methode, siehe andere Antworten.USE MyUrlEncode.URLencoding (String url, String enc) , das Problem zu umgehen
quelle
Verwenden Sie den Zeichensatz "
ISO-8859-1
" für URLEncoderquelle