2009-10-27 26 views
526

Kiedy jest spacja w adresie URL zakodowanym do + i kiedy jest kodowana do %20?URL kodujący znak spacji: + lub% 20?

+1

To pytanie byłoby bardziej pomocne w przypadku kilku pytań związanych z konkretnym językiem, prawda? – squarecandy

+0

Możliwy duplikat [Kiedy zakodować spację na plus (+) lub% 20?] (Http://stackoverflow.com/questions/2678551/when-to-encode-space-to-plus-or-20) – user

+1

@ użytkownik pytanie, które łączysz, zostało zadane później, co czyni go dupe, a nie tym. –

Odpowiedz

308

Od Wikipedia (podkreślenie i linkiem dodanej):

Gdy dane, które zostały wprowadzone w formularzach HTML jest złożony, nazwy pól formularza i wartości są kodowane i przesyłane do serwera w komunikacie żądania HTTP za pomocą metoda GET lub POST lub historycznie za pośrednictwem poczty e-mail. Kodowanie używane domyślnie opiera się na bardzo wczesnej wersji ogólnych zasad kodowania procentowego URI, z number of modifications, takich jak normalizacja nowej linii i zastępowanie spacji "+" zamiast "% 20". Dane MIME zakodowane w ten sposób to application/x-www-form-urlencoded, a obecnie jest on zdefiniowany (nadal w bardzo przestarzałym stylu) w specyfikacjach HTML i XForms.

więc procent kodowania rzeczywistym wykorzystuje %20 a dane w postaci URL w zmodyfikowanej postaci, która wykorzystuje +. Dlatego najprawdopodobniej zobaczysz tylko + w adresach URL w ciągu zapytania po ?.

+2

Więc + kodowanie byłoby technicznie wieloczęściowe/kodowanie danych formularzy, a kodowanie procentowe to application/x-www-form-urlencoded? –

+16

@BC: no - 'multipart/form-data' używa kodowania MIME; 'application/x-www-form-urlencoded' używa' + ', a poprawnie zakodowane identyfikatory URI używają'% 20'. – McDowell

+8

"Więc najprawdopodobniej zobaczysz tylko + w adresach URL w ciągu zapytania po znaku?" Jest niedopowiedzeniem. Nigdy nie powinieneś widzieć "+" w części ścieżki adresu URL, ponieważ nie zrobi to, czego oczekujesz (spacja). –

20

Polecam %20.

Czy je kodujesz?

Nie jest to jednak spójne w wielu językach. Jeśli się nie mylę, w PHP urlencode() traktuje spacje jako +, podczas gdy Python urlencode() traktuje je jako %20.

EDYTOWANIE:

Wygląda na to, że się mylę. Python urlencode() (przynajmniej w 2.7.2) używa quote_plus() zamiast quote() i tym samym koduje spacje jako "+". Wydaje się również, że rekomendacja W3C jest „+” zgodnie tutaj: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

I rzeczywiście, można śledzić tę interesującą debatę na własnym trackerze emisyjnej Pythona o tym, co ma być używany do kodowania spacji: http://bugs.python.org/issue13866.

EDIT # 2:

Rozumiem, że najczęstszym sposobem kodowania „” jest jak „+”, ale po prostu uwaga, to może być tylko mnie, ale uważam, że to nieco mylące:

import urllib 
print(urllib.urlencode({' ' : '+ '}) 

>>> '+=%2B+' 
+0

Nie hardcoding. Próbuję określić z perspektywy estetycznej, jak będą wyglądały moje adresy zawierające spacje. –

+14

PHP ma również 'rawurlencode()', który używa '% 20'. – eyelidlessness

+3

'urlencode()' Pythona traktuje je jako '+' – Yarin

182

To zamieszanie jest spowodowane tym, że adres URL jest nadal "uszkodzony" do dnia dzisiejszego.

Weźmy na przykład "http://www.google.com". To jest adres URL. Adres URL to Uniform Resource Locator i jest w rzeczywistości wskaźnikiem do strony internetowej (w większości przypadków). Adresy URL mają bardzo dobrze zdefiniowaną strukturę od czasu pierwszej specyfikacji w 1994 roku.

Możemy wyodrębnić szczegółowe informacje o "http://www.google.com" URL:

+---------------+-------------------+ 
|  Part  |  Data   | 
+---------------+-------------------+ 
| Scheme  | http    | 
| Host   | www.google.com | 
+---------------+-------------------+ 

Jeśli spojrzymy na bardziej złożonej zawartości, takie jak:

"https://bob:[email protected]:8080/file;p=1?q=2#third"

my może wydobyć 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 

Zarezerwowane znaki są różne dla każdej części.

Dla adresów HTTP, spacja w części fragmentu ścieżki musi być zakodowana do "% 20" (nie absolutnie nie "+"), podczas gdy znak "+" w części fragmentu ścieżki może pozostać nie zakodowany.

Teraz w części kwerendy spacje mogą być zakodowane do "+" (dla kompatybilności wstecznej: nie próbuj szukać go w standardzie URI) lub "% 20" podczas gdy znak "+" (jako wynik tej niejednoznaczności) musi być zmieniony na "% 2B".

Oznacza to, że „niebieski + niebieski” łańcuch ma być zakodowany różny sposób w części toru i zapytań:

http://example.com/blue+light%20blue?blue%2Blight+blue”.

Z tego można wywnioskować, że kodowanie w pełni zbudowanego adresu URL jest niemożliwe bez znajomości składni struktury adresu URL.

Co to sprowadza się do:

Trzeba %20 przed ? i + po.

Source

+0

>> powinieneś mieć% 20 przed? i + po Przepraszamy za głupie pytanie. Wiem trochę jak ten parametr hashtag jest używany po "?" parametr znaku zapytania. Chociaż jest inaczej, ponieważ użycie "#" nie powoduje przeładowania strony. Ale próbuję użyć znaku% 20 i + po hashtagu "#" i wygląda na to, że nie działa. Którego użyć po "#"? – Philcyb

+0

@Philcyb Możesz przeczytać ten artykuł https://en.wikipedia.org/wiki/Percent-encoding –

5

przestrzeń może być zakodowany tylko w "+" w parach klucz wartość "application/x-www postać urlencoded" zawartość typu zapytania część zawartości. To MAY, a nie MUSI. W pozostałych adresach URL jest zakodowany jako% 20.

Moim zdaniem lepiej jest zawsze zakodować spacje jako% 20, a nie jako "+", nawet w części kwerendy adresu URL, ponieważ jest to specyfikacja HTML (RFC-1866), która określa, że ​​spacje powinny być zakodowane jako "+" w parach klucz-wartość typu content-application/x-www-form-urlencoded. (patrz paragraf 8.2.1, akapit 1). Ten sposób kodowania danych formularzy jest również podany w późniejszych specyfikacjach HTML, na przykład poszukaj odpowiednich akapitów o aplikacji/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 zakodowanie spacji jako plusy: "http://example.com/over/there?name=foo+bar". Tak więc, tylko po "?", Spacje mogą być zastąpione przez plusy, zgodnie ze specyfikacją HTML. W innych przypadkach spacje powinny być zakodowane do% 20. Ale ponieważ trudno jest poprawnie określić kontekst, najlepiej jest nigdy nie kodować spacji jako "+".

Polecam kodowanie procentowe wszystkich znaków oprócz "bez zastrzeżeń" zdefiniowanych w RFC-3986, p.2.3

unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 

Implementacja zależy od wybranego języka programowania.

Jeśli adres URL zawiera znaki narodowe, najpierw zakoduj je w UTF-8, a następnie zakoduj wynik w procentach.

+1

Dlaczego ktoś powinien dbać o specyfikację HTML, jeśli żądany zasób nie jest HTML? Widziałem "+" w niektórych Web API, które nie reagują na HTML, np. prosisz o pdf. Uważam za błędne, że nie używają "% 20". –

Powiązane problemy