Wiem, że +
ciąg zapytania w adresie URL reprezentuje spację. Czy tak jest również poza regionem ciągu zapytania? To znaczy, czy następujący adres URL:
http://a.com/a+b/c
faktycznie reprezentują:
http://a.com/a b/c
(a zatem należy je zakodować, jeśli powinno to być a +
), czy też faktycznie reprezentuje a+b/c
?
url
encoding
query-string
Francisco Ryan Tolmasky I
źródło
źródło
rawurldecode
. Mówię to tutaj w celach informacyjnych, ponieważ jest to wysoko oceniany wynik w wyszukiwaniu w Google „php url dekoduje przerwy na znak plus”.Odpowiedzi:
+
znaki w komponencie ścieżki powinny być traktowane dosłownie.Mówiąc wprost:
+
jest tylko znakiem specjalnym w komponencie zapytania.źródło
+
znak jest interpretowany jako spacja w elemencie zapytania? Czy jest to po prostu zasada „z dziczy”?http:
), uprawnienie (//server.example.com
) i ścieżkę (/myfile/mypage.htm
) i nie definiuje żadnego specjalnego znaczenia dla+
znaku. Specyfikacja HTML definiuje komponent zapytania jako mime type application / x-www-form-urlencoded, który jest zdefiniowany jako „zamień spacje+
i inne znaki specjalne jak w RFC1738”. Więc nie jest to „z natury”, ale z przyjętego (nie RFC) standardu.Server.UrlEncode
błędnie koduje spacje jako plusy również w części ścieżki, co narusza reguły HTTP.Możesz znaleźć ładną listę odpowiednich znaków zakodowanych w URL na W3Schools .
+
staje się%2B
%20
źródło
%25252B
Znaki spacji mogą być kodowane jako „+” tylko w jednym kontekście: pary klucz-wartość application / x-www-form-urlencoded.
RFC-1866 (specyfikacja HTML 2.0), pkt 8.2.1. akapit pierwszy mówi: „Nazwy i wartości pól formularza są znakami ucieczki: znaki spacji są zastępowane przez„ + ”, a następnie znaki specjalne są zastępowane”).
Oto przykład takiego ciągu w adresie URL, w którym RFC-1866 zezwala na kodowanie spacji jako plusów: „ http://example.com/over/there?name=foo+bar ”. Tak więc, tylko po znaku „?” Spacje można zastąpić plusami (w innych przypadkach spacje należy zakodować na% 20). Ten sposób kodowania danych formularza jest również 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.
Ponieważ jednak trudno jest zawsze poprawnie określić kontekst, najlepszą praktyką jest, aby nigdy nie kodować spacji jako „+”. Lepiej jest kodować procentowo wszystkie znaki oprócz „niezarezerwowanych” zdefiniowanych w RFC-3986, str. 2.3. Oto przykład kodu ilustrujący, co należy zakodować. Jest podawany w języku programowania Delphi (pascal), ale bardzo łatwo jest zrozumieć, jak działa dla każdego programisty, niezależnie od posiadanego języka:
źródło
użyj funkcji encodeURIComponent do naprawy adresu URL, działa na przeglądarce i node.js
źródło
Spróbuj poniżej:
źródło
escape
jest przestarzałe, zamiast tego należy użyćencodeURI
lub w przypadku części zapytaniaencodeURIComponent
. Również łańcuch parametrów powinien kodować zgodnie z w3c .Zawsze będziesz kodować adresy URL.
Oto jak Ruby koduje twój adres URL:
źródło