Delphi XE7 では、TNetEncoding.URL.Encode を使用することをお勧めします。
これまでのところ、カスタム ルーチンを使用してきました。
class function THttp.UrlEncode(const S: string; const InQueryString: Boolean): string;
var
I: Integer;
begin
Result := EmptyStr;
for i := 1 to Length(S) do
case S[i] of
// The NoConversion set contains characters as specificed in RFC 1738 and
// should not be modified unless the standard changes.
'A'..'Z', 'a'..'z', '*', '@', '.', '_', '-', '0'..'9',
'$', '!', '''', '(', ')':
Result := Result + S[i];
'—': Result := Result + '%E2%80%94';
' ' :
if InQueryString then
Result := Result + '+'
else
Result := Result + '%20';
else
Result := Result + '%' + System.SysUtils.IntToHex(Ord(S[i]), 2);
end;
end;
上記の方法を使用して、エンコードされたパラメーター S がパスの一部であるかクエリ文字列の一部であるかを手動で指定できました。
スペースは、パスで見つかった場合は + としてエンコードする必要があり、%20 はクエリ パラメーターの一部であるためです。
上記の関数は適切に発行します
Url := 'http://something/?q=' + THttp.UrlEncode('koko jambo', true);
// Url := http://something/?q=koko%20jambo
しかし、以下は異なる値を返しています
Url := 'http://something/?q=' + TNetEncoding.URL.Encode('koko jambo;);
// Url := http://something/?q=koko+jambo
スペースを含むクエリ パラメータを %20 としてエンコードするために TNetEncoding.URL.Encode を適切に使用する方法を詳しく教えてください。