Boşluk karakterleri yalnızca bir bağlamda "+" olarak kodlanabilir: application / x-www-form-urlencoded anahtar / değer çiftleri.
RFC-1866 (HTML 2.0 özellikleri), paragraf 8.2.1. altparagraf 1. diyor ki: "Form alanı adları ve değerleri kaçıyor: boşluk karakterleri` `+ '' ile değiştiriliyor ve sonra ayrılmış karakterler kaçıyor").
URL'de böyle bir dizeye örnek olarak RFC-1866'nın boşlukları artı olarak kodlamaya izin verdiği bir örnek verilmiştir: " http://example.com/over/there?name=foo+bar ". Bu nedenle, yalnızca "?" Karakterinden sonra boşluklar artılarla değiştirilebilir (diğer durumlarda, boşluklar% 20 olarak kodlanmalıdır). Form verilerini kodlamanın bu yolu, daha sonraki HTML spesifikasyonlarında da verilir; örneğin, HTML 4.01 Spesifikasyonu'ndaki application / x-www-form-urlencoded ile ilgili paragrafları arayın, vb.
Ancak, içeriği her zaman doğru bir şekilde belirlemek zor olduğundan, boşlukları asla "+" olarak kodlamamak en iyi uygulamadır. RFC-3986, s.2.3'te tanımlanan "kaydedilmemiş" dışındaki tüm karakterlerin yüzde olarak kodlanması daha iyidir. Neyin kodlanması gerektiğini gösteren bir kod örneği. Delphi (pascal) programlama dilinde verilir, ancak sahip olduğu dilden bağımsız olarak herhangi bir programcı için nasıl çalıştığını anlamak çok kolaydır:
(* 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;