Spodziewam się
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
do wyjścia:
Hello%20World
(20 to kod szesnastkowy ASCII dla spacji)
Jednak otrzymuję:
Hello+World
Czy używam złej metody? Jaka jest właściwa metoda, której powinienem użyć?
Odpowiedzi:
Zachowuje się zgodnie z oczekiwaniami. Te
URLEncoder
narzędzia specyfikacji HTML dla Jak zakodować URL w postaci HTML.Z javadocs :
i ze specyfikacji HTML :
Będziesz musiał go wymienić, np:
źródło
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Spacja jest kodowana
%20
w adresach URL oraz+
w przesyłanych danych formularzach (typ zawartości application / x-www-form-urlencoded). Potrzebujesz tego pierwszego.Korzystanie z guawy :
Możesz użyć UrlEscapers :
Nie używaj String.replace, to zakoduje tylko spację. Zamiast tego użyj biblioteki.
źródło
Ta klasa wykonuje
application/x-www-form-urlencoded
kodowanie typu zamiast kodowania procentowego, dlatego zastąpieniego
+
jest poprawnym zachowaniem.Z javadoc:
źródło
url
przestrzeń należy interpretować jako%20
. Więc musimy zrobićurl.replaceAll("\\+", "%20")
? A jeśli to javascript, nie powinniśmy używaćescape
funkcji. UżyjencodeURI
lubencodeURIComponent
zamiast. Tak myślałem.Koduj parametry zapytania
LUB jeśli chcesz uniknąć znaków w identyfikatorze URI
źródło
org.apache.commons.httpclient.util.URIUtil
wydaje się być najbardziej efektywnym sposobem rozwiązania problemu!Hello+World
to sposób, w jaki przeglądarka zakoduje dane formularza (application/x-www-form-urlencoded
) dlaGET
żądania i jest to ogólnie przyjęta forma dla części adresu URI zawierającej zapytanie.Jeśli wysłałeś to żądanie do serwletu Java, serwlet poprawnie zdekodowałby wartość parametru. Zwykle jedyny przypadek, w którym występują tutaj problemy, to niezgodność kodowania.
Ściśle mówiąc, w specyfikacjach HTTP lub URI nie ma wymogu, aby część zapytania była kodowana przy użyciu
application/x-www-form-urlencoded
par klucz-wartość; część zapytania musi po prostu mieć formę, którą akceptuje serwer WWW. W praktyce raczej nie będzie to problemem.Ogólnie byłoby niepoprawne użycie tego kodowania dla innych części identyfikatora URI (na przykład ścieżki). W takim przypadku należy użyć schematu kodowania opisanego w dokumencie RFC 3986 .
Więcej tutaj .
źródło
Inne odpowiedzi przedstawiają albo ręczną zamianę ciągu, URLEncoder, który faktycznie koduje format HTML, porzucony URIUtil Apache lub użycie UrlEscapers Guava . Ten ostatni jest w porządku, z wyjątkiem tego, że nie zapewnia dekodera.
Apache Commons Lang dostarcza URLCodec , który koduje i dekoduje zgodnie z formatem URL rfc3986 .
Jeśli korzystasz już ze Springa, możesz również zdecydować się na użycie jej klasy UriUtils .
źródło
„+” jest poprawne. Jeśli naprawdę potrzebujesz% 20, potem sam wymień Plusses.
źródło
+
Postać w oryginalnym tekście ma być zakodowany jako%2B
.+
poprawnie bez znajomości kontekstu jest przynajmniej pedantyczne. Głosowano w dół. Przeczytaj inne odpowiedzi, aby dowiedzieć się, kiedy należy użyć + lub% 20.Po prostu zmagałem się z tym również na Androidzie, udało mi się natknąć na Uri.encode (String, String), podczas gdy specyficzne dla Androida (android.net.Uri) może być przydatne dla niektórych.
statyczne kodowanie String (String s, String dozwolone)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
źródło
To zadziałało dla mnie
źródło
Chociaż dość stary, niemniej jednak szybka odpowiedź:
Spring udostępnia UriUtils - dzięki temu możesz określić, jak zakodować i która część jest powiązana z URI, np.
Używam ich, ponieważ używamy już Springa, czyli nie jest wymagana żadna dodatkowa biblioteka!
źródło
Sprawdź klasę java.net.URI.
źródło
Tak, ta metoda java.net.URLEncoder.encode nie została stworzona do konwersji „” na „20%” zgodnie ze specyfikacją ( źródło ).
Nawet to nie jest właściwa metoda, możesz ją zmodyfikować, aby:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
miłego dnia =).źródło
URLEncoder.encode
) i załatanie jej,replaceAll
która zadziała tylko w tym konkretnym przypadku. Zamiast tego użyj właściwej klasy i metody, zobacz inne odpowiedzi.UŻYJ MyUrlEncode.URLencoding (String url, String enc), aby rozwiązać problem
źródło
użyj zestawu znaków „
ISO-8859-1
” dla URLEncoderźródło