Los caracteres de espacio solo se pueden codificar como "+" en un contexto: pares de clave-valor de application / x-www-form-urlencoded.
El RFC-1866 (especificación HTML 2.0), párrafo 8.2.1. el subpárrafo 1. dice: "Se escapan los nombres y valores de los campos de formulario: los caracteres de espacio se reemplazan por '+', y luego se escapan los caracteres reservados").
Aquí hay un ejemplo de una cadena de este tipo en URL donde RFC-1866 permite codificar espacios como ventajas: " http://example.com/over/there?name=foo+bar ". Por lo tanto, solo después de "?", Los espacios se pueden reemplazar por más (en otros casos, los espacios se deben codificar en% 20). Esta forma de codificar datos de formulario también se proporciona en especificaciones HTML posteriores, por ejemplo, busque párrafos relevantes sobre application / x-www-form-urlencoded en la especificación HTML 4.01, y así sucesivamente.
Pero, dado que es difícil determinar siempre el contexto correctamente, es la mejor práctica nunca codificar espacios como "+". Es mejor codificar en porcentaje todos los caracteres, excepto "sin reservas" definidos en RFC-3986, p.2.3. Aquí hay un ejemplo de código que ilustra lo que debe codificarse. Se administra en lenguaje de programación Delphi (pascal), pero es muy fácil de entender cómo funciona para cualquier programador, independientemente del lenguaje que posea:
(* 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;