Adres URL kodujący znak spacji: + czy %20?

Kiedy spacja w adresie URL jest kodowana jako +, a kiedy jest kodowana jako %20?


person BC.    schedule 27.10.2009    source źródło
comment
To pytanie byłoby bardziej pomocne niż kilka pytań dotyczących konkretnego języka, prawda?   -  person squarecandy    schedule 11.01.2015
comment
Możliwy duplikat Kiedy kodować spację na plus (+) lub% 20?   -  person user    schedule 16.04.2017
comment
@user pytanie, do którego linkujesz, zostało zadane później, co czyni go duplikatem, a nie tym.   -  person Warlike Chimpanzee    schedule 01.09.2017


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 ?.

person Joey    schedule 27.10.2009
comment
Zatem kodowanie + byłoby technicznie kodowaniem wieloczęściowym/formularza, podczas gdy kodowanie procentowe to kodowanie aplikacji/x-www-form-urlencoded? - person BC.; 28.10.2009
comment
@BC: nie - 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
comment
Zatem najprawdopodobniej zobaczysz tylko znak + w adresach URL w ciągu zapytania po znaku ? To mało powiedziane. Nigdy nie powinieneś widzieć + w ścieżce adresu URL, ponieważ nie zrobi tego, czego oczekujesz (spacja). - person Adam Gent; 22.07.2011
comment
@McDowell Twoja odpowiedź, komentarz BC był dla mnie bardzo pomocny, wraz z wkładem Adama Genta - person Chris Marisic; 09.07.2012
comment
Cześć, też jestem zdezorientowany, czasami widziałem użycie książki +, ale czasami% 20, Kiedy użytkownik przesyła formularz, w jaki sposób formularz koduje spację? z jaką postacią? Czy wynik zależy od przeglądarki? - person Sam YC; 07.11.2012
comment
Krótko mówiąc: celem przesłania GET jest 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
comment
Uris danych używają tego samego kodowania co uris. Po przeczytaniu tego RFC mogę śmiało powiedzieć, że nie jestem wystarczająco mądry, aby rozszyfrować, czy kodowanie spacji powinno być dozwolone jako znak +. Mogę jednak powiedzieć, że jeśli użyjesz + zamiast %20, dane uri nie będą działać w przeglądarkach. - person Rob Murphy; 28.04.2014
comment
@Rob: Prawdopodobnie nie jest to dozwolone w identyfikatorach URI danych. Ponieważ, jak już wspomniano, jest to tylko w części zapytania, w której używany jest +. - person Joey; 28.04.2014
comment
Pamiętaj, że w przypadku linków e-mailowych potrzebujesz %20, a nie + po ?. Na przykład 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
comment
To pomogło mi, stackoverflow.com /pytania/5572718/ - person zeros-and-ones; 19.12.2017
comment
Problem z użyciem plusa polega na tym, że jeśli chcesz akceptować znaki plus oddzielnie od spacji, takich jak ?search=The A+ School - person Curtis; 01.08.2019

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.

Źródło

person Matas Vaitkevicius    schedule 29.04.2015
comment
›› powinieneś mieć %20 przed ? i + po Przepraszam za głupie pytanie. Wiem trochę, że parametr hashtagu jest używany po ? parametr znaku zapytania. Chociaż jest w jakiś sposób inaczej, ponieważ użycie # nie powoduje ponownego załadowania strony. Ale próbowałem użyć znaku% 20 i + po hashtagu # i wygląda na to, że nie działa. Którego należy użyć po #? - person Philcyb; 22.12.2015
comment
@Philcyb Być może zechcesz przeczytać to en.wikipedia.org/wiki/Percent-encoding - person Matas Vaitkevicius; 23.12.2015
comment
Czy część zapytania faktycznie ma oficjalny standard? Myślałem, że w zasadzie ta część jest specyficzna dla aplikacji. 99,99% aplikacji używa 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
comment
Dziękujemy za zwrócenie uwagi, że myląca niespójność wynika z wadliwego projektu starszego typu. - person wlnirvana; 09.04.2020
comment
Właściwie, właśnie rzuciłem okiem na artykuł na blogu LunaTech, do którego uprzejmie się odniosłeś, i wiadomość, którą chcesz wyciągnąć do domu, wydaje się bardziej następująca: Musisz użyć %20, a nie + przed ?, 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
comment
Wow, stary. Muszę przyznać, że wykres w formacie ASCII wygląda świetnie. - person Miłosz Brzechczyn; 09.06.2021

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+'
person Rui Vieira    schedule 27.10.2009
comment
Nie na stałe. Próbuję określić z estetycznego punktu widzenia, jak będą wyglądać moje adresy URL zawierające spacje. - person BC.; 28.10.2009
comment
Cześć, też jestem zdezorientowany. Kiedy użytkownik przesyła formularz HTML, w jaki sposób formularz koduje spację? z jaką postacią? Czy wynik zależy od przeglądarki? - person Sam YC; 07.11.2012
comment
Metoda URLEncoder.encode() w Javie konwertuje ją również na +. - person рüффп; 24.10.2014
comment
Następnie pojawia się pytanie, jak traktować kodowanie w treści żądania POST: Content-Type: application/x-www-form-urlencoded gdzie parametry mają postać a=b&c=d, ale nie są w ogóle w adresie URL, tylko w treści dokumentu. Zrobili naprawdę bałagan w tej sprawie i cholernie trudno jest znaleźć ostateczne odpowiedzi. - person fyngyrz; 05.12.2014
comment
Perls uri_escape() traktuje je jako%20 - person someuser; 08.02.2015
comment
Problem z% 20 polega na tym, że jeśli dodasz go do adresu URL, serwer przekieruje go na nowy adres URL z tym samym zapytaniem, może zakodować wartość procentową i otrzymasz %2520 zamiast% 20 - person Curtis; 01.08.2019

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.

person Maxim Masiutin    schedule 27.10.2016
comment
Dlaczego ktokolwiek powinien przejmować się specyfikacją HTML, jeśli żądany zasób nie jest HTML? Widziałem + w niektórych interfejsach API sieci Web, które nie odpowiadają za pomocą HTML, np. prosisz o pdf. Uważam za błędne, że nie używają% 20. - person The incredible Jan; 12.10.2017
comment
@TheincredibleJan, zgadzam się z Tobą. O to właśnie chodzi w mojej odpowiedzi. - person Maxim Masiutin; 02.04.2018
comment
@MaximMasiutin Kiedy twoja odpowiedź mówi, że to MOŻE, a nie MUSI, o której specyfikacji mówisz? Staram się znaleźć specyfikację, która ma to jak najbardziej. W w3.org/TR /1999/REC-html401-19991224/interact/ użycie znaku „+” (w sekcji zapytań) należy do sekcji „obowiązkowej” specyfikacji. - person JosephH; 07.05.2019
comment
@JosephH - dziękuję za notatkę. To jest moja osobista opinia na temat MAJU. Edytowałem post. Miałem na myśli to, że specyfikacja HTML, którą zacytowałeś, definiuje +, ale w kontekście adresu URL obowiązują inne reguły, które pozwalają również na kodowanie spacji jako %20. - person Maxim Masiutin; 03.06.2019