Kiedy spacja w adresie URL jest kodowana jako +
, a kiedy jest kodowana jako %20
?
Adres URL kodujący znak spacji: + czy %20?
Odpowiedzi (4)
Z Wikipedia (dodano podkreślenie i link):
Po przesłaniu danych wprowadzonych do formularzy HTML nazwy i wartości pól formularza są kodowane i wysyłane do serwera w komunikacie żądania HTTP przy użyciu metody GET lub POST lub, historycznie, pocztą elektroniczną. Domyślnie używane kodowanie opiera się na bardzo wczesnej wersji ogólnych zasad kodowania procentowego URI, z liczba modyfikacji, takich jak normalizacja nowej linii i zamiana spacji na „+” zamiast „%20”. Typ MIME zakodowanych w ten sposób danych to application/x-www-form-urlencoded i jest obecnie zdefiniowany (wciąż w bardzo przestarzały sposób) w specyfikacjach HTML i XForms.
Zatem rzeczywiste kodowanie procentowe wykorzystuje %20
, podczas gdy dane formularzy w adresach URL mają zmodyfikowaną formę, która wykorzystuje +
. Zatem najprawdopodobniej zobaczysz tylko +
w adresach URL w ciągu zapytania po ?
.
multipart/form-data
używa kodowania MIME; application/x-www-form-urlencoded
używa +
, a prawidłowo zakodowane URI używa %20
.
- person McDowell; 28.10.2009
http://www.bing.com/search?q=hello+world
i zasób ze spacją w nazwie http://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
- person William Entriken; 14.04.2013
+
.
- person Joey; 28.04.2014
mailto:[email protected]?subject=I%20need%20help
. Jeśli spróbujesz tego z +, wiadomość e-mail otworzy się z +es zamiast spacji.
- person Sygmoral; 19.02.2015
To zamieszanie wynika z tego, że adresy URL do dziś są „uszkodzone”.
Weźmy na przykład „http://www.google.com”. To jest adres URL. Adres URL jest jednolitym lokalizatorem zasobów i tak naprawdę jest wskaźnikiem do strony internetowej (w większości przypadków). Od czasu pierwszej specyfikacji w 1994 r. adresy URL mają w rzeczywistości bardzo dobrze zdefiniowaną strukturę.
Możemy wyodrębnić szczegółowe informacje na temat adresu URL „http://www.google.com":
+---------------+-------------------+
| Part | Data |
+---------------+-------------------+
| Scheme | http |
| Host | www.google.com |
+---------------+-------------------+
Jeśli spojrzymy na bardziej złożony adres URL, taki jak:
„https://bob:[email protected]:8080/file;p=1?q=2#trzeci"
możemy wyodrębnić następujące informacje:
+-------------------+---------------------+
| Part | Data |
+-------------------+---------------------+
| Scheme | https |
| User | bob |
| Password | bobby |
| Host | www.lunatech.com |
| Port | 8080 |
| Path | /file;p=1 |
| Path parameter | p=1 |
| Query | q=2 |
| Fragment | third |
+-------------------+---------------------+
https://bob:[email protected]:8080/file;p=1?q=2#third
\___/ \_/ \___/ \______________/ \__/\_______/ \_/ \___/
| | | | | | \_/ | |
Scheme User Password Host Port Path | | Fragment
\_____________________________/ | Query
| Path parameter
Authority
Znaki zastrzeżone są różne dla każdej części.
W przypadku adresów URL HTTP spacja w części fragmentu ścieżki musi być zakodowana jako „%20” (nie, absolutnie nie „+”), natomiast znak „+” w części fragmentu ścieżki może pozostać niezakodowany.
Teraz w części zapytania spacje mogą być zakodowane jako „+” (dla kompatybilności wstecznej: nie próbuj szukać ich w standardzie URI) lub „%20”, podczas gdy znak „+” (w wyniku tej niejednoznaczności ) należy uciec do „%2B”.
Oznacza to, że ciąg „niebieski+jasnoniebieski” musi być zakodowany inaczej w ścieżce i części zapytania:
"http://example.com/blue+light%20blue?blue%2Blight+blue”.
Z tego można wywnioskować, że kodowanie w pełni skonstruowanego adresu URL jest niemożliwe bez znajomości składniowej struktury adresu URL.
Sprowadza się to do:
Powinieneś mieć %20
przed ?
i +
po.
key1=value1&key1=value2
, gdzie klucze i wartości są kodowane przy użyciu dowolnych reguł, których należy przestrzegać encodeURIComponent
, ale AFAIK zawartość części zapytania jest całkowicie zależna od aplikacji. W przeciwnym razie dotyczy to tylko pierwszego #
, nie ma oficjalnego kodowania.
- person gman; 26.07.2018
?
, ale po ?
to po prostu kwestia gustu. Na miłość boską, ludzie, po prostu zawsze używajcie kodowania opartego na znakach procentowych i zwalniajcie trochę miejsca w mózgu na ważniejsze rzeczy.
- person nydame; 06.12.2020
Poleciłbym %20
.
Czy kodujesz je na stałe?
Nie jest to jednak zbyt spójne w różnych językach. Jeśli się nie mylę, w PHP urlencode()
traktuje spacje jako +
, podczas gdy w Pythonie urlencode()
traktuje je jako %20
.
EDYTOWAĆ:
Wygląda na to, że się mylę. Python urlencode()
(przynajmniej w wersji 2.7.2) używa quote_plus()
zamiast quote()
i dlatego koduje spacje jako „+”. Wydaje się również, że zalecenie W3C to „+”, jak tutaj: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
I faktycznie, możesz śledzić tę interesującą debatę na temat własnego modułu do śledzenia problemów Pythona na temat tego, czego używać do kodowania spacji: http://bugs.python.org/issue13866.
EDYCJA #2:
Rozumiem, że najpopularniejszym sposobem kodowania „” jest „+”, ale tylko uwaga, może to tylko ja, ale uważam to za nieco mylące:
import urllib
print(urllib.urlencode({' ' : '+ '})
>>> '+=%2B+'
URLEncoder.encode()
w Javie konwertuje ją również na +
.
- person рüффп; 24.10.2014
Spację można zakodować jako „+” tylko w części adresu URL będącej zapytaniem w przypadku par klucz-wartość typu treści „application/x-www-form-urlencoded”. Moim zdaniem jest to MOŻE, a nie MUSI. W pozostałych adresach URL jest on kodowany jako%20.
Moim zdaniem lepiej jest zawsze kodować spacje jako% 20, a nie jako „+”, nawet w części adresu URL zawierającej zapytanie, ponieważ specyfikacja HTML (RFC-1866) określa, że spacje powinny być kodowane jako „ +” w parach klucz-wartość typu „application/x-www-form-urlencoded” (patrz akapit 8.2.1. akapit 1.)
Ten sposób kodowania danych formularzy jest także podany w późniejszych specyfikacjach HTML. Na przykład poszukaj odpowiednich akapitów na temat application/x-www-form-urlencoded w specyfikacji HTML 4.01 i tak dalej.
Oto przykładowy ciąg w adresie URL, w którym specyfikacja HTML umożliwia kodowanie spacji jako plusów: „http://example.com/over/there?name=foo+bar”. Zatem tylko po „?” spacje można zastąpić plusami. W pozostałych przypadkach spacje należy zakodować na %20. Ponieważ jednak trudno jest poprawnie określić kontekst, najlepszą praktyką jest nigdy nie kodowanie spacji jako „+”.
Polecam kodowanie procentowe wszystkich znaków z wyjątkiem „niezarezerwowanych” zdefiniowanych w RFC-3986, p.2.3
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Implementacja zależy od wybranego języka programowania.
Jeśli Twój adres URL zawiera znaki narodowe, najpierw zakoduj je w formacie UTF-8, a następnie zakoduj wynik procentowo.