Пробіли символів можуть бути кодовані як "+" лише в одному контексті: application / x-www-form-urlencoded пари ключа-значення.
RFC-1866 (специфікація HTML 2.0), пункт 8.2.1. у підпункті 1. сказано: "Імена та значення полів форми ухиляються: символи пробілу замінюються на" + ", а потім резервні символи уникають").
Ось приклад такої рядка в URL-адресі, де RFC-1866 дозволяє кодувати пробіли як плюси: " http://example.com/over/there?name=foo+bar ". Отже, лише після "?" Пробіли можна замінити плюсами (в інших випадках пробіли повинні бути закодовані до% 20). Цей спосіб кодування даних форми також наведений у пізніших специфікаціях HTML, наприклад, шукайте відповідні параграфи про application / x-www-form-urlencoded у специфікації HTML 4.01 тощо.
Але, оскільки важко завжди правильно визначити контекст, найкраща практика ніколи не кодує пробіли як "+". Краще відсотковим кодуванням всіх символів, крім "незарезервованого", визначеного в RFC-3986, p.2.3. Ось приклад коду, який ілюструє, що слід закодувати. Він наданий мовою програмування Delphi (pascal), але дуже легко зрозуміти, як це працює для будь-якого програміста незалежно від мови, якою він володіє:
(* 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;