gpt4 book ai didi

delphi - Indy Call 的撇号编码

转载 作者:行者123 更新时间:2023-12-01 21:58:50 24 4
gpt4 key购买 nike

我正在使用 Delphi XE 和 Indy 10。我正在使用 TIdHTTP 调用 Web 服务,其中参数包含非标准撇号:Bev'sBev's 相比。

以 urlencoded 形式,我将参数传递为:Bev%E2%80%99s

但是网络服务将此解释为:Bev%C3%A2%C2%80%C2%99s

相关代码:

idHttp.ConnectTimeOut := iTimeOut;
idhttp.HTTPOptions := [hoForceEncodeParams];

是否有地方我必须指定它以某种方式编码?

最佳答案

%C3%A2%C2%80%C2%99 是字节 E2 80 99 的 UTF-8 编码形式的 urlencoded 形式,依次是' 字符的 UTF-8 编码形式。因此,您遇到了双重编码问题,其中 ' 在进行 urlencode 之前被编码为 UTF-8 两次。

hoForceEncodeParams 标志由 TIdHTTPSetRequestParams() 方法使用,该方法由 的重载版本调用Post() 方法具有 ASource: TStrings 输入参数。

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() 会将它们字符集编码为字节(基于指定的 AByteEncoding 参数,其中 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;

关于delphi - Indy Call 的撇号编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48544792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com