0

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 を適切に使用する方法を詳しく教えてください。

4

1 に答える 1

1

ドキュメントを読む:

System.NetEncoding.TURLEncoding

TURLEncoding は、スペース (プラス記号: +)と次の予約済み URL エンコード文字のみをエンコードします: ;:&=+,/?%#[]。

TNetEncoding.URL.Encodeスペースを としてエンコードすることはできません%20

通常、個別の andメソッドがあるため、 IndyのTIdURIクラスをお勧めしますが、どちらもスペースもエンコードするため、「パスに見つかった場合は + としてエンコードされる」という要件を満たしません。PathEncode()ParamsEncode()%20

于 2014-10-19T23:50:15.927 に答える