Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为Indy Call编码撇号_Delphi_Indy - Fatal编程技术网

Delphi 为Indy Call编码撇号

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]; 有什么地方我必须指定它是

我正在使用Delphi XE和Indy 10。我正在使用
TIdHTTP
调用一个webservice,其中一个参数包含非标准撇号:
Bev's
vs
Bev'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