Les caractères d'espace ne peuvent être codés que "+" dans un seul contexte: paires clé-valeur application / x-www-form-urlencoded.
RFC-1866 (spécification HTML 2.0), paragraphe 8.2.1. le sous-paragraphe 1. dit: "Les noms et valeurs des champs du formulaire sont échappés: les caractères d'espace sont remplacés par" + ", puis les caractères réservés sont échappés").
Voici un exemple d'une telle chaîne dans l'URL où la RFC-1866 autorise le codage des espaces comme avantages: " http://example.com/over/there?name=foo+bar ". Ainsi, seulement après "?", Les espaces peuvent être remplacés par des points positifs (dans d'autres cas, les espaces doivent être codés en% 20). Cette méthode de codage des données de formulaire est également indiquée dans les spécifications HTML ultérieures, par exemple, recherchez les paragraphes pertinents sur application / x-www-form-urlencoded dans la spécification HTML 4.01, etc.
Mais, comme il est difficile de toujours déterminer correctement le contexte, il est préférable de ne jamais coder les espaces en "+". Il est préférable de coder en pourcentage tous les caractères sauf "non réservé" défini dans RFC-3986, p.2.3. Voici un exemple de code qui illustre ce qui doit être encodé. Il est donné en langage de programmation Delphi (pascal), mais il est très facile de comprendre comment il fonctionne pour n'importe quel programmeur quel que soit le langage possédé:
(* 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;