Karakter spasi hanya dapat dikodekan sebagai "+" dalam satu konteks: application / x-www-form-urlencoded pasangan nilai kunci.
RFC-1866 (spesifikasi HTML 2.0), paragraf 8.2.1. subparagraf 1. mengatakan: "Nama-nama bidang nilai-nilai dan melarikan diri: karakter spasi diganti dengan` + ', dan kemudian karakter yang dipesan melarikan diri ").
Berikut adalah contoh string di URL di mana RFC-1866 memungkinkan ruang pengkodean sebagai plus: " http://example.com/over/there?name=foo+bar ". Jadi, hanya setelah "?", Spasi dapat diganti dengan plus (dalam kasus lain, spasi harus dikodekan ke% 20). Cara pengkodean data formulir ini juga diberikan dalam spesifikasi HTML nanti, misalnya, cari paragraf yang relevan tentang aplikasi / x-www-form-urlencoded dalam Spesifikasi HTML 4.01, dan seterusnya.
Tapi, karena sulit untuk selalu menentukan konteks dengan benar, itu praktik terbaik untuk tidak pernah menyandikan spasi sebagai "+". Lebih baik untuk meng-enkode semua karakter kecuali "tanpa cadangan" yang didefinisikan dalam RFC-3986, hal.2.3. Berikut adalah contoh kode yang menggambarkan apa yang harus dikodekan. Itu diberikan dalam bahasa pemrograman Delphi (pascal), tetapi sangat mudah untuk memahami cara kerjanya untuk setiap programmer terlepas dari bahasa yang dimiliki:
(* 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;