Các ký tự khoảng trắng chỉ có thể được mã hóa thành "+" trong một ngữ cảnh: các cặp khóa-giá trị ứng dụng / x-www-form-urlencoding.
RFC-1866 (đặc tả HTML 2.0), đoạn 8.2.1. đoạn 1. nói: "Các tên và giá trị của trường biểu mẫu được thoát: các ký tự khoảng trắng được thay thế bằng` + ', và sau đó các ký tự dành riêng được thoát ").
Dưới đây là ví dụ về một chuỗi như vậy trong URL trong đó RFC-1866 cho phép mã hóa không gian dưới dạng dấu cộng: " http://example.com/over/there?name=foo+bar ". Vì vậy, chỉ sau "?", Không gian có thể được thay thế bằng dấu cộng (trong các trường hợp khác, khoảng trắng phải được mã hóa thành% 20). Cách mã hóa dữ liệu biểu mẫu này cũng được đưa ra trong các thông số kỹ thuật HTML sau này, ví dụ: tìm các đoạn có liên quan về ứng dụng / x-www-form-urlencoding trong Đặc tả HTML 4.01, v.v.
Nhưng, bởi vì thật khó để luôn xác định chính xác bối cảnh, đó là cách tốt nhất để không bao giờ mã hóa các khoảng trắng thành "+". Tốt hơn là mã hóa phần trăm tất cả các ký tự ngoại trừ "không được bảo vệ" được xác định trong RFC-3986, tr.2.3. Dưới đây là một ví dụ mã minh họa những gì nên được mã hóa. Nó được đưa ra trong ngôn ngữ lập trình Delphi (pascal), nhưng rất dễ hiểu cách thức hoạt động của nó đối với bất kỳ lập trình viên nào, bất kể ngôn ngữ sở hữu:
(* 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;