首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Indy调用编码Apostrophe

为Indy调用编码Apostrophe
EN

Stack Overflow用户
提问于 2018-01-31 22:40:51
回答 1查看 354关注 0票数 1

我使用Delphi和Indy10。我使用TIdHTTP调用non服务,其中的一个参数包含非标准撇号:Bev’s vs Bev's

在the编码的形式中,我将参数传递为:Bev%E2%80%99s

然而,webservice将其解释为:Bev%C3%A2%C2%80%C2%99s

相关代码:

代码语言:javascript
运行
复制
idHttp.ConnectTimeOut := iTimeOut;
idhttp.HTTPOptions := [hoForceEncodeParams];

有没有什么地方我必须指定它是以某种方式编码的?

EN

回答 1

Stack Overflow用户

发布于 2018-02-01 01:23:25

%C3%A2%C2%80%C2%99是字节E2 80 99的UTF8编码形式的turn编码形式,而字节UTF8编码形式又是字符的UTF8编码形式。因此,您会遇到双重编码问题,其中先被编码为UTF-8两次,然后再被UTF编码。

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

代码语言:javascript
运行
复制
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编码,例如:

代码语言:javascript
运行
复制
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()不会对它们做任何事情,它们是按原样发送的,例如:

代码语言:javascript
运行
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48544792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档