Leerzeichen dürfen nur in einem Kontext als "+" codiert werden: application / x-www-form-urlencodierte Schlüssel-Wert-Paare.
Der RFC-1866 (HTML 2.0-Spezifikation), Absatz 8.2.1. In Unterabsatz 1 heißt es: "Die Formularfeldnamen und -werte werden maskiert: Leerzeichen werden durch" + "ersetzt, und dann werden reservierte Zeichen maskiert").
Hier ist ein Beispiel für eine solche Zeichenfolge in einer URL, in der RFC-1866 das Codieren von Leerzeichen als Pluspunkte zulässt: " http://example.com/over/there?name=foo+bar ". Leerzeichen können also erst nach "?" Durch Pluszeichen ersetzt werden (in anderen Fällen sollten Leerzeichen in% 20 codiert werden). Diese Art der Codierung von Formulardaten wird auch in späteren HTML-Spezifikationen angegeben. Suchen Sie beispielsweise nach relevanten Absätzen zu application / x-www-form-urlencoded in der HTML 4.01-Spezifikation usw.
Da es jedoch schwierig ist, den Kontext immer korrekt zu bestimmen, empfiehlt es sich, Leerzeichen niemals als "+" zu codieren. Es ist besser, alle Zeichen mit Ausnahme von "nicht reserviert", wie in RFC-3986, S. 2.3 definiert, prozentual zu codieren. Hier ist ein Codebeispiel, das zeigt, was codiert werden soll. Es wird in der Programmiersprache Delphi (Pascal) gegeben, aber es ist sehr leicht zu verstehen, wie es für jeden Programmierer funktioniert, unabhängig von der Sprache, die er besitzt:
(* 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;