问题描述
Socket:=TmyidHTTP.Create(NIL);
IOHandler:=TIdioHandlerStack.Create(Socket);
Socket.HandleRedirects:=true;
Socket.AllowCookies:=FALSE;
Socket.ProtocolVersion:=pv1_1;
Socket.HTTPOptions:=Socket.HTTPOptions+[hoKeepOrigProtocol]+[honoprotocolErrorException]+[hoWantProtocolErrorContent];
Socket.Request.CustomHeaders.FoldLines:=FALSE;
Socket.Request.CharSet:='utf-8';
Socket.Request.ContentType:='text/txt';
Socket.Request.Accept:='*/*';
// Socket.ReuseSocket:=rsTrue;
Socket.Request.Connection:='keep-alive';
(TmyidHTTP仅发布受保护的DoRequest
)
但是当我查看协议时,会看到以下标头:charset=ISO-8859-1
。
仅当我在帖子前再次指定Socket.Request.CharSet:='utf-8';
时,它才有效...
有什么想法可以重置CharSet吗?
解决方法
发生这种情况是因为:
- 您使用的是Indy 10 1 的旧版本。
- 您要在设置
ContentType
属性之后设置CharSet
属性。。 - 您没有在
charset
属性上指定ContentType
属性值。
因此,在这种情况下,ContentType
属性设置器将使用默认值重置CharSet
属性,而不是保留当前值。
1 这是already fixed于2019年7月:
Embarcadero RSP-13703的修补程序。更新各种ContentType属性设置器,以保留现有的CharSet属性值(如果已设置)并且未指定新的charset属性。
您应该使用Indy的GitHub repo中的最新代码更新已安装的Indy副本(或至少对现有副本应用相同的修复程序,然后再对recompile Indy应用)。
否则,您可以简单地将代码更改为:
- 交换两个属性分配的顺序:
Socket.Request.ContentType:='text/txt';
Socket.Request.CharSet:='utf-8';
- 在
charset
分配上指定一个ContentType
属性值,这将相应地更新CharSet
属性:
Socket.Request.ContentType:='text/txt;charset=utf-8';