スペース文字は、1つのコンテキストで "+"としてのみエンコードできます:application / x-www-form-urlencoded Key-Valueペア。
RFC-1866(HTML 2.0仕様)、パラグラフ8.2.1。サブパラグラフ1は次のように述べています。「フォームフィールドの名前と値はエスケープされます。スペース文字は `+ 'に置き換えられ、予約文字はエスケープされます。」
RFC-1866がスペースをプラスとしてエンコードできるURLのそのような文字列の例は次のとおりです: " http://example.com/over/there?name=foo+bar "。したがって、「?」の後のみ、スペースをプラスで置き換えることができます(他の場合では、スペースは%20にエンコードする必要があります)。このフォームデータのエンコード方法は、後のHTML仕様でも提供されています。たとえば、HTML 4.01仕様でapplication / x-www-form-urlencodedに関する関連する段落を探します。
ただし、常にコンテキストを正しく判断することは難しいため、スペースを「+」としてエンコードしないことがベストプラクティスです。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;