我使用Delphi和Indy10。我使用TIdHTTP
调用non服务,其中的一个参数包含非标准撇号:Bev’s
vs Bev's
。
在the编码的形式中,我将参数传递为:Bev%E2%80%99s
然而,webservice将其解释为:Bev%C3%A2%C2%80%C2%99s
相关代码:
idHttp.ConnectTimeOut := iTimeOut;
idhttp.HTTPOptions := [hoForceEncodeParams];
有没有什么地方我必须指定它是以某种方式编码的?
发布于 2018-02-01 01:23:25
%C3%A2%C2%80%C2%99
是字节E2 80 99
的UTF8编码形式的turn编码形式,而字节UTF8编码形式又是’
字符的UTF8编码形式。因此,您会遇到双重编码问题,其中’
先被编码为UTF-8两次,然后再被UTF编码。
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()
将它们进行字符集编码为字节(基于指定的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;
https://stackoverflow.com/questions/48544792
复制相似问题