2009-06-17 13 views
159

Mam świadomość, że + w ciągu zapytania adresu URL reprezentuje spację. Czy tak jest również poza regionem łańcucha zapytania? To znaczy, ma następujący adres URL:Adresy URL i znaki plus

http://a.com/a+b/c 

rzeczywiście reprezentują:

http://a.com/a b/c 

(a więc muszą być kodowane, czy powinna ona być w rzeczywistości +), czy też w rzeczywistości faktycznie reprezentują a+b/c?

+0

http://www.w3schools.com/tags/ref_urlencode. asp –

+4

Zauważ, że w php urldecode dekoduje% 2b (kodowany +) do spacji. Aby tego uniknąć, użyj 'rawurldecode'. Mówię to tutaj w celach informacyjnych, ponieważ jest to wynik wysoko oceniany w wyszukiwarce Google dla "zerwania dekodowania adresu URL w php na plusie". – danielson317

+1

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

Odpowiedz

136
  • kodowania procent w sekcji toru o zawartości do zdekodowania, ale
  • żadnych + znaki składnika ścieżki jest oczekuje się, że będzie traktowany dosłownie.

Wyraźnie: + to tylko znak specjalny w składniku zapytania.

+5

+1 Niestety, wielu "koderów/enkoderów URL" na wolności nie rozumie tego. Np. Http://www.sislands.com/coin70/week6/encoder.htm http://www.keyone.co.uk/tools-url-encoder.asp http://meyerweb.com/eric/tools/dencoder/ – leonbloy

+6

@Stobor: potrzebne cytowanie. – bukzor

+5

@Stobor Czy w RFC kiedykolwiek stwierdzano, że znak '+' jest interpretowany jako spacja w składniku zapytania? Czy jest to po prostu reguła "od dzikiego"? – Pacerier

-3

Będziesz zawsze kodował adresy URL.

Oto jak Ruby koduje adres URL:

irb(main):008:0> CGI.escape "a.com/a+b" 
=> "a.com%2Fa%2Bb" 
+0

Przepraszamy , pozwól mi trochę wyjaśnić. Jeśli użytkownik wpisze "http://a.com/a+b/", to należy to interpretować jako% 20b, a nie% 2Bb? –

+8

Nie jestem pewien, czy to prawda. Zgodnie z RFC2396 (http://www.ietf.org/rfc/rfc2396.txt) plusses nie są zarezerwowanymi znakami na ścieżce (segmentach) URI, a jedynie elementem zapytania. Wydaje się to sugerować, że nie muszą być zakodowane za pomocą adresu URL, a zatem nie powinny być interpretowane jako spacje na ścieżce, tylko w zapytaniu. – tlrobinson

+0

Ah w porządku. Byłby to% 2Bb! –

158

można znaleźć ładne listę odpowiadających URL zakodowane znaki na W3Schools.

  • + się %2B
  • przestrzeń staje Oczekuje %20
+13

Jest całkowicie legalne, aby literalne znaki "+" pojawiały się w elemencie * path * pod adresem URL. –

+1

Aby uzyskać literalne +, które ma być odebrane przez tylny koniec (lub przynajmniej PHP), musi być potrójnie zakodowane: '% 25252B' – Umbrella

+2

Ta odpowiedź jest całkowicie nieistotna dla pytania. –

-3

Spróbuj poniżej:

<script type="text/javascript"> 

function resetPassword() { 
    url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char); 
} 
function fixEscape(str) 
{ 
    return escape(str).replace("+", "%2B"); 
} 
</script> 
+2

Uważam, że to bardzo dziwne, że dwie osoby głosowały na tę odpowiedź. To dosłownie nie ma nic wspólnego z pytaniem. –

+1

Co w przypadku innych znaków * @ - _ +./ – Ravi

+0

@AndrewBarber Dlaczego uważasz, że nie ma to znaczenia? + staje się% 2B –

2

użycie funkcji encodeURIComponent naprawić url, to działa w przeglądarce i node.js

res.redirect("/signin?email="+encodeURIComponent("[email protected]")); 


> encodeURIComponent("http://a.com/a+b/c") 
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc' 
12

znaków przestrzeń może być kodowane tylko jako "+" w jednym kontekście: Kody pary klucz-wartość application/x-www-form-urlencoded.

RFC-1866 (specyfikacja HTML 2.0), punkt 8.2.1. akapit pierwszy mówi: "Nazwy pól formularza i wartości są unikane: znaki spacji zostają zastąpione znakami" + ", a znaki zastrzeżone").

Oto przykład takiego łańcucha w adresie URL, gdzie RFC-1866 pozwala na kodowanie spacji jako plusów: "http://example.com/over/there?name=foo+bar". Tak więc, tylko po "?", Spacje mogą być zastąpione przez plusy (w innych przypadkach spacje powinny być zakodowane do% 20). Ten sposób kodowania danych formularzy jest również podany w późniejszych specyfikacjach HTML, na przykład wyszukaj odpowiednie akapity dotyczące aplikacji/x-www-form-urlencoded w specyfikacji HTML 4.01 i tak dalej.

Ponieważ trudno jest zawsze poprawnie określić kontekst, najlepiej jest nigdy nie kodować spacji jako "+". Lepiej kodować procentowo wszystkie znaki oprócz "niezarezerwowanych" zdefiniowanych w RFC-3986, p.2.3. Oto przykład kodu, który ilustruje, co powinno być zakodowane.Lek podaje się w Delphi (pascal) język programowania, ale to jest bardzo łatwe do zrozumienia, jak to działa dla każdego programisty, niezależnie od języka posiadał:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *) 
function UrlEncodeRfcA(const S: AnsiString): AnsiString; 
const  
    HexCharArrA: array [0..15] of AnsiChar = 'ABCDEF'; 
var 
    I: Integer; 
    c: AnsiChar; 
begin 
// percent-encoding, see RFC-3986, p. 2.1 
    Result := S; 
    for I := Length(S) downto 1 do 
    begin 
    c := S[I]; 
    case c of 
     'A' .. 'Z', 'a' .. 'z', // alpha 
     '0' .. '9',    // digit 
     '-', '.', '_', '~':; // rest of unreserved characters as defined in the RFC-3986, p.2.3 
     else 
     begin 
      Result[I] := '%'; 
      Insert('00', Result, I + 1); 
      Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)]; 
      Result[I + 2] := HexCharArrA[Byte(C) and $F]; 
     end; 
    end; 
    end; 
end; 

function UrlEncodeRfcW(const S: UnicodeString): AnsiString; 
begin 
    Result := UrlEncodeRfcA(Utf8Encode(S)); 
end;