Frage

Ich bin mir bewusst, dass ein + in dem Query-String einer URL einen Raum darstellt. Ist dies auch der Fall außerhalb der Query-String-Region? Das heißt, tut die folgende URL:

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

tatsächlich darstellen:

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

(und damit muß kodiert werden, wenn es tatsächlich ein + sein soll), oder tut es in der Tat tatsächlich a+b/c darstellen?

War es hilfreich?

Lösung

  • Percent Codierung im Wegabschnitt einer URL decodiert werden soll, wird erwartet, aber
  • alle + Zeichen in der Pfadkomponente wird erwartet, dass buchstäblich behandelt werden.

Um explizit: + ist nur ein Sonderzeichen in der Abfragekomponente

.

Andere Tipps

Sie können eine schöne Liste finden von URL-codierten Zeichen entsprechend auf W3Schools .

  • + wird %2B
  • Raum wird %20

Space Zeichen nur als "+" in einem Zusammenhang codiert werden können. Application / x-www-form-urlencoded Schlüssel-Wert-Paare

Die RFC-1866 (HTML 2.0-Spezifikation), Absatz 8.2.1. Unterabsatz 1 heißt es: „Die Formularfeldnamen und Werte entkommen sind: Leerzeichen ersetzt werden durch` +‘und dann sind reservierte Zeichen escaped“)

.

Hier ist ein Beispiel für einen solchen String in URL, RFC-1866-Codierung Räume als Plusse erlaubt: " http://example.com/over/there?name=foo+bar ". Also, erst nach „?“, Leerzeichen können durch Pluszeichen ersetzt werden (in anderen Fällen Räume sollten% 20 codiert werden). Diese Art der Datencodierung Form wird auch in späteren HTML-Spezifikationen angegeben, zum Beispiel, suchen Sie nach relevanten Absätzen über application / x-www-form-urlencoded in HTML 4.01 Spezifikation, und so weiter.

Aber, weil es schwer ist immer richtig, um den Kontext zu bestimmen, ist es die beste Praxis nie Räume kodieren als „+“. Es ist besser, Prozent codieren alle Zeichen außer „nicht reserviert“ definiert in RFC-3986, p.2.3. Hier ist ein Codebeispiel, was zeigt codiert werden soll. Es wird in Delphi (Pascal) Programmiersprache gegeben, aber es ist sehr leicht zu verstehen, wie es für jeden Programmierer unabhängig von der Sprache arbeitet besessen:

(* 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 = '0123456789ABCDEF';
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;

Verwendung encodeURIComponent Funktion URL zu beheben, es funktioniert auf Browser und node.js

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


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

Versuchen Sie unter:

<script type="text/javascript">

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

Du sollst immer kodieren URLs.

Hier ist, wie Ruby-kodiert Ihre URL:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top