如何使用TNetEncoding.URL.Encode对查询字符串参数中的空格进行编码?

时间:2014-10-19 20:42:39

标签: delphi encoding delphi-xe7

在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是Path的一部分还是Query字符串的一部分。

如果在路径中找到空格,则应将其编码为+,并且%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

请详细说明TNetEncoding.URL.Encode应该以什么方式正确用于编码包含%20空格的查询参数?

1 个答案:

答案 0 :(得分:1)

阅读文档:

System.NetEncoding.TURLEncoding

  

TURLEncoding仅对空格(加号:+)和以下保留的URL编码字符进行编码:;:& = +,/?%#[]。

无法将TNetEncoding.URL.Encode个空格编码为%20

通常情况下,我建议使用Indy的TIdURI类,因为它有单独的PathEncode()ParamsEncode()方法,但它们都将空格编码为%20,但不是满足您的“编码为+如果在路径中找到”要求。