Delphi 为Indy Call编码撇号
我正在使用Delphi XE和Indy 10。我正在使用Delphi 为Indy Call编码撇号,delphi,indy,Delphi,Indy,我正在使用Delphi XE和Indy 10。我正在使用TIdHTTP调用一个webservice,其中一个参数包含非标准撇号:Bev'svsBev's 在urlencoded表单中,我将参数传递为:Bev%E2%80%99s 然而,Web服务将其解释为:Bev%C3%A2%C2%80%C2%99s 相关代码: idHttp.ConnectTimeOut := iTimeOut; idhttp.HTTPOptions := [hoForceEncodeParams]; 有什么地方我必须指定它是
TIdHTTP
调用一个webservice,其中一个参数包含非标准撇号:Bev's
vsBev's
在urlencoded表单中,我将参数传递为:Bev%E2%80%99s
然而,Web服务将其解释为:Bev%C3%A2%C2%80%C2%99s
相关代码:
idHttp.ConnectTimeOut := iTimeOut;
idhttp.HTTPOptions := [hoForceEncodeParams];
有什么地方我必须指定它是以某种方式编码的吗?
%C3%A2%C2%80%C2%99
是UTF-8字节编码形式的URL编码形式E2 80 99
,反过来是字符的UTF-8编码形式。因此,出现了双重编码问题,“
在被URL编码之前被编码到UTF-8两次
hoForceEncodeParams
标志由TIdHTTP
的SetRequestParams()
方法使用,该方法由具有ASource:TStrings
输入参数的Post()
方法的重载版本调用
function Post(AURL: string; ASource: TStrings; AByteEncoding: IIdTextEncoding = nil): string; overload;
procedure Post(AURL: string; ASource: TStrings; AResponseContent: TStream; AByteEncoding: IIdTextEncoding = nil); overload;
如果启用了hoForceEncodeParams
标志,则输入时字符串将被取消编码SetRequestParams()
将字符集编码为字节(基于指定的abyteconding
参数,其中UTF-8是默认值),然后url编码字节,例如:
idhttp.HTTPOptions := idhttp.HTTPOptions + [hoForceEncodeParams];
data := TStringList.Create;
data.Add('name=Bev’s');
idhttp.Post(url, data); // sends 'name=Bev%E2%80%99s'
data.Free;
如果禁用了hoForceEncodeParams
标志,则字符串应在输入时进行url编码SetRequestParams()
不会对它们做任何事情,它们按原样发送,例如:
idhttp.HTTPOptions := idhttp.HTTPOptions - [hoForceEncodeParams];
data := TStringList.Create;
data.Add('name=Bev%E2%80%99s');
idhttp.Post(url, data); // sends 'name=Bev%E2%80%99s'
data.Free;
让Indy对该参数进行编码。感谢您的详细评论。然而,我做的是“获取”,而不是帖子。在Get上,我看到SetRequestParams方法没有被调用。@MSchenkel不,它没有被调用,因为Get
请求没有发送正文。GET
发送的唯一参数是URL本身,在未编码的?
字符之后,例如:http://host/path?params
。在这种情况下,您需要将一个预URL编码的URL传递给TIdHTTP
,并按原样发送给服务器。如果您将Bev%E2%80%99s
传递到TIdHTTP
,这就是它发送的方式,而不是作为Bev%C3%A2%C2%80%C2%99s
TIdHTTP
不解码和重新编码URL。但是,您没有提供一个详细的示例,以显示您是如何使用TIdHTTP
。